作者:刘刚
来源:郑老师频道
郑老师特意邀请了资深算法大牛来给咱们讲讲图像算法基础,也是咱们粉丝的小福利啦,下面我们就一起来学习吧。
以下内容为视频文字整理版。
---------------------------------------------
应郑老师的要求,给大家分享一下图像处理的基础知识。讲的不好请大家谅解一下。
【图像处理领域】
首先讲下图像处理在哪些方面有应用。其实我们生活当中很多方面都用到图像处理。
我大概举例几个图片,其实这些图片只是冰山一角。
比如我知道这个人的位置,例如用空调,风扇的时候,我们就可以做智能送风。
比如康护,例如老人摔倒了或者家人摔倒了,我们可以进行姿态识别,可以进行识别并提醒
比如现在新冠病毒,我们可以进行一些肺部识别,识别出病灶。
还有一些工业生产领域的摄像头,例如摄像头有没有划痕,坏点,组装过程有没有异常,导致视野变小,或者颜色,畸变
还有一些3D测量领域里面,我们怎么分离去提取物体的高度。
总之,像人脸识别,美图秀秀,这些用得非常广,像photoshop这种很经典的工具,图像处理的算法特别多。
【图像处理——基本工具】
我简单说下图像处理的工具。我说的是开发的工具,像美图秀秀,ps等这些也是一些图像处理的工具。这些工具是后台已经集成很多算法。比如图像做些去噪点,塑脸,平滑等的处理。
我这里讲的是我们用一些工具,也可以做一些算法。
图像算法工具:
1.Matlab,多用于学校实验室。有专门图像处理的库。
2.python,也很强大,和Matlab一样是脚本,也可以做到项目里面,生成动态链接库等。
3.openCV,也是强大的开源的图像处理库
4.Halcon,是工业级的,它的算法做了很多优化,编程方面做了很多工具,我们的算法可以从Halcon导出成代码。
5. VisionPro,也是可以直接导出算法,通过拖拽的方式集成到程序里面
Halcon,VisionPro 和NI-Vision都是收费的。
除了这些还有很多图像工具,医学里面很多工具像ITK,神经网络用的也很多,例如caffe,像深度学习方面,通过cnn去检测,识别。
【Matlab——处理效果】
这里简单讲下Matlab。效果怎么样,我用Matlab简单尝试一下,验证一下哪个算法在实际中应用的比较好。
这里引脚,结合高度信息和灰度信息提取的引脚。其实这块引脚的高度和引脚高度是一样的。现在我们去掉噪声,得到信息再把噪声去掉。从算法里面,这个流程效果是比较好的,最后我们通过过滤,把引脚过滤出来。我们通过这个区域,把高度数据提取出来,取得他的平面度,大概是这样的一个思路。
【Matlab图像处理——滤波器】
接下来我简单讲一下,这就是Matlab的脚本。
前面这里是我们设置运算卷积的形状。读取一副图片,这里是中值滤波。
中值滤波我大概简单给大家讲一下,这里是1个3*3的卷积,这个3*3的卷积和和我的一个图片做卷积的时候,得到的一个,
实际上是这个3*3的范围内,我取到一个值,做一个排序,这9个值做一个排序,然后我拿中间的那个值和这9个值做一个填充,那么我再进行划窗。
第2步我们再对这个区域进行一个处理,类似的我们叫做一个感兴趣的区域(ROI)吧,我对我感兴趣的区域才做图像处理,其他区域不做处理,或者屏蔽掉。
第3步是做阈值处理,我们所有图片做处理的时候,一般都使用灰度图片。实际上我们拍摄到的是3通道的图像,我们叫彩色图片(就是RGB图片)。一般我们把RGB的图像转换成灰色图像,把这个灰度图像转换到0~255这个范围,然后对这个图片进行二值化,二值化之后就变成只有0和1这两个值。这样我们就好处理了,比如是0的区域我们怎么处理,是1的区域我们怎么处理,它叫做二值化。那么二值化的时候,比如有个值100,那么在小于100的时候我就认为是黑色(认为是0),大于等于100的时候我就认为是白色(认为是1)。
第4步,这里有个开运算,图像处理里面比较常见的形态学运动,开运算以及闭运算。
第5步,最后是对二值图像进行中值滤波。
【Matlab——自动阈值】
简单说下阈值处理的算法。其实我们每个人都有一套自己的算法,不管干任何事情的时候都有一套算法。只要把你的想法,转换成代码,他就是一个算法。比如我们去买菜或者去超市购物,我们想的是用最短的路径能买到所有的东西,我们买的时候肯定是有个路径的。这个跟我们常说的TSP,最短路由算法类似的。我们平时在家里做事也有这样,闭频处理的方法,我先做菜还是先做饭。我们每个人都是天生的智能算法的制造者。
我简单的说个自动阈值的方法。自动阈值的方法实际上来说就是提取一个图片,我先把图片进行二值化。比如这个图片直方图的分布是这样的,像这样比较常见的,比如我要提取他的前景和背景的时候,我找到一个峰值,找到中间的这样一个点的时候,比如这个是前景,这个是后景,那么我找到这两个峰值中间的这一个点的时候,那么我就可以把这个图片进行二值化。
二值化之后,我想要的目标可以提取出来。那么,就要找到这个阈值。比如这个是0,这是255,这个方法是这样的。首先,我们找到这个图片最大的灰度值。假如最大的灰度值在这里,最小的在这里,那么我先给他一个初始的灰度值(1/2倍的)来作为它的阈值,大于它的我就是认为是前景,小于它的就是背景。再把它的前景跟背景计算出来之后,计算出来之后再取他的二分之一,作为这个新的阈值,通过这个新的阈值再划分前景背景。
在求得这个阈值的时候跟初始化的阈值进行比较,如果这两个值不相等,那我就继续进行迭代,直到这个值不变了,就停止了。如果他们还不相同,我就把这个值赋值,每次进行迭代,直到一个平衡点。不变了,均值跟上次的分割点不变了,那么我们就找到了这个阈值。
我们还可以认为的给它一个阈值,比如我知道这个值认为的给它100。
这个就是Matlab处理图像的一个方式。我这里演示一下。
(Matlab演示中)这里参数跟之前设置的参数有点不同(演示过程文稿略)
【Python图像处理】
Python实际也是很好的图像处理工具。这个地方(例子)是Python用来提取图像的轮廓。我们可以引入python图像的包,叫做PIL,还有工具包pylab。
【Python+OpenCV】
另一个就是Python可以把opencv的包cv2,安装的方法:pip install opencv-python。
这个课程主要简单讲下入门的知识,我接着往下讲。
Opencv还有这个图像处理的网站不错,http://wiki.opencv.org.cn
【OpenCV简介】
(OpenCV教程演示)
OpenCV是基于C/C++语言的库,但是他有很多版本。有c#的,有python的版本,经过了优化,可以做实时图像处理,有很多接口可以调用。Opencv有很多模块,像深度学习,GPU的模块。
【OpenCV功能】
OpenCV有很多操作,比如有数据的操作,内存分配释放,图像复制,最多是矩阵的操作,但Matlab对矩阵操作更强。
还有支持一些数据结构,像链表,队列这些。
比如轮廓,轮廓可以看成点的链表,或者队列,都可以。
还有一些点的处理。
另外一些像结构分析的,连通域,比如说4连通,或者8连通。很多基础算法都是用4连通和8连通做出来的。
还有些摄像头标定。摄像头标定后,图片就像一把尺子一样,每个像素代表一毫米,那么我这里就可以做一些测量,拍个照片就知道有多远。
另外还可以做些运动跟踪,比如安防里面,可以做些目标跟踪,比如家里做些智能检测。
还有目标识别,像人脸识别,人脸检测,这些类型的。
还有些界面的用的比较少,还有图像标注。
Opencv的功能还是挺强大的。
【Debug VS Release】
很多程序都是可以做一些优化,64位会比32位的快,Release会比Debug的快。
【Halcon是个强大的图像处理工具】
Halcon这里的算子我大概简单讲一下,算法很强大的包括一维测量,二维,三维的,每个模块里面包括很多基础的算子。Halcon这个工具他的开发版和license比较贵,在大型的项目里用的比较多,他开发的效率比较高,比如说我做一个简单的字符识别,可能只要一个小时,就可以把这个项目demo做出来,再在这个基础上进行迭代完善。
它这里专门有个OCR模块,还有标定的模块也很方便Calibration模块,我们直接的在线的方式就可以采集跟标定。它还可以检测我们标定的精度,做得非常好,匹配也做得非常好Matching模块,匹配的精度也做得非常高。
【提取圆方法过程】
这里简单讲一下,比如这个算子,在Halcon里面的时候这个算法,比如这里相当于是做了一个连通域。对Halcon来说他就相当于是一个锐减,我对这个图片这个圆做了边缘提取之后,得到了它的锐减。我只希望要这个圆形的区域,那么我就可以对这个圆形的边缘进行过滤,通过这个过滤我只保留像素在10~30的这个范围内。我过滤了这个区域后,我得到了想要的这个目标,得到目标后在算法里面怎么用了,我可以导出的方式,导出C++或者C#,放到工程,当然我们也可以直接api的方式调用halcon接口。
然后对每个参数进行调整,像这里每个函数有它的C++或者C#的版本,像这里读取图片的索贝尔的算子,还有那个转化,二值化图片,还有这个连通区域的提取,另外这个是对连通区域进行过滤。
【Halcon输出代码如下】
这里我们刚才导出来的C++的代码。最后加了一个Union,通过Hough检测圆的算法得到检测到的圆。
今天大概就是讲这些,简单给大家讲下图像处理的应用领域和用到的工具,谢谢大家。
---------------------------------
作者:刘刚
文字编辑:郑虹
声明:如需转载请联系作者刘刚|ID(liugang9931706)
如果喜欢本文,请关注郑老师频道。
成长,就是每天进步一点点。坚持哦,共勉!