一、缺陷检测综述
缺陷检测是视觉需求中难度最大一类需求,主要是其稳定性和精度的保证。首先常见缺陷:凹凸、污点瑕疵、划痕、裂缝、探伤等。常用的手法有六大金刚(在halcon中的ocv和印刷检测是针对印刷行业的检测,有对应算子封装):
1.blob+特征(例如官方示例surface_scratch.hdev)
2.blob+差分+特征
3.光度立体
4.特征训练
5.测量拟合
6.频域+空间结合
二、频域+空间结合法
1、频域结合空间,其实频域就是用波动观点看世界,看问题角度变了,光经过镜头其实发生的是傅立叶变换,此思想在傅立叶光学上有所阐述,就像光经棱镜分光,而光进入计算机内部,进行了采样和量化,然后我们用函数f(x,y)来表示这些数据描述。图像处理应用傅里叶变换就是将空间域(图像本身)转换至频率域。傅里叶变换可以将一个信号函数,分解一个一个三角函数的线性组合。由于任何周期函数都可以由多个正弦函数构成,那么按照这个思想,图像由f(x,y)来表示,那么这时你就可以拆成多个正弦函数构成,这样每个正弦函数都有一个自己的频率。
2、频率特征是图像的灰度变化特征,低频特征是灰度变化不明显,例如图像整体轮廓,高频特征是图像灰度变化剧烈,如图像边缘和噪声。一个重要的经验结论:低频代表图像整体轮廓,高频代表了图像噪声,中频代表图像边缘、纹理等细节。
3、什么时候使用傅里叶变换进行频域分析?
1)具有一定纹理特征的图像,纹理可以理解为条纹,如布匹、木板、纸张等材质容易出现。
2)需要提取对比度低或者信噪比低的特征。
3)图像尺寸较大或者需要与大尺寸滤波器进行计算,此时转换至频域计算,具有速度优势。因为空间域滤波为卷积过程(加权求和),频域计算直接相乘。
4、举例
*1采集图像 read_image (Image66, 'C:/Users/Administrator/Desktop/66.png') rgb1_to_gray (Image66, GrayImage) *2预处理之拉开对比度(这里采用频域,频域到空间域的常用算子有三个fft_iamge,rft_generic,fft_generic fft_generic (GrayImage, ImageFFT, 'to_freq', -1, 'sqrt', 'dc_center', 'complex') *注意一般在频域里就是选择你想要的频段而已,被称为滤波,这个手法在halcon中有三个, *一个是直接手画,然后paint_region *一个是涉及滤波器,然后进行滤波,这个对于初学者有点难度,先掌握常见滤波器。 *第三个就是调用power_real,对其进行blob解析。 *这里用的直接手动paint_region,选择对应的频段 gen_rectangle1 (ROI_0, 350.855, 3.85433, 473.273, 1101.15) paint_region (ROI_0, ImageFFT, ImageResult, 0, 'fill') *注意这里又回到了空间,频域和空间是同等重要地位,只是看问题的角度不一样,这也符合唯物辩证法法 fft_generic (ImageResult, ImageFFT1, 'from_freq', 1, 'sqrt', 'dc_center', 'byte') *接下来就是一个blob提取而已,当然这里方法可以根据情况变化多端,比如你可以分水领域法, *然后调用select_gray,对每个区域对应灰度值特征进行筛选,当然您也可以用共生矩阵 emphasize (ImageFFT1, ImageEmphasize, 7, 7, 1) threshold (ImageEmphasize, Regions, 44, 101) dilation_circle (Regions, RegionDilation, 3.5) connection (RegionDilation, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 78.88, 190.87) *这里就是显示而已 dev_display (Image66) dev_display (SelectedRegions)
另外,halcon自带的例子detect_mura_defects_texture.hdev也值得学习
更多的内容,参见我的另一篇博文《halcon视觉缺陷检测之频域和空间域转换的方法详解》
三、光度立体法
在工业领域,表面检测是一个非常广泛的应用领域。在halcon中,使用增强的光度立体视觉方法,三维表面检测被加强。利用阴影可方便快速的检测物体表面的缺口或凹痕。 使用光度立体视觉方法可在复杂图像中轻松找到表面缺陷 。
四面打光,合成图像,求取梯度图型,然后Halcon里的光度立体法也是这方面的应用,关键的算子就是photometric_stereo。
潜在问题:
1.看官方例子貌似都是条形组合光源打光,用光度立体法检测,一定要把缺陷打出来才行吗?
2.一定要取4张图片吗?
3.photometric_stereo (Images, HeightField, Gradient, Albedo, Slants, Tilts, ResultType, 'poisson', [], [])该算子的配置有什么讲究吗?
举例:检测-光度立体法检测药片包装背面的缺陷
官方例子:皮革检测,inspect_leather_photometric_stereo.hdev
四、他山之石
http://www.ihalcon.com/read-16432.html
1.标准缺陷检测:
所谓标准,就是不针对行业特点,这里基本分为如下几类:
标准预处理功能:图像增强、腐蚀、膨胀、开运算、闭运算、滤波、傅立叶变换、距离变换、差分等,《机器视觉软件开发完整过程记录——第四段》中有详细说明,不累述
面积检测:阈值后计算ROI内面积,《机器视觉软件开发完整过程记录——第四段》中有详细说明,不累述
Blob检测:阈值联通后计算Blob,《机器视觉软件开发完整过程记录——第四段》中有详细说明,不累述
浓度差检测:计算ROI范围内的最大浓度、最小浓度、浓度差
直线/曲线上的毛刺/缺陷:拟合直线/曲线,计算边缘点到直线/曲线距离
标准的做法一般都是拿标准的算法块进行组合,以达到缺陷检测的效果,例如以下流程就是一个缺陷检测标准流程:
1设置基准图模板——>2当前图模板定位——>3生成仿射变换矩阵——>4旋转平移图像或者区域——>5预处理差分——>6预处理滤波/腐蚀/膨胀——>7Blob检测——>8面积检测
2.非标缺陷检测(半导体行业)
相对与标准做法,非标的做法就非常多,有些非标的目的是为了减少操作步骤,例如将上面的组合流程变成一个工具,这个我们称之为业务逻辑非标。还有一些非标主要是做图像预处理部分,例如修改一些标准预处理的算子和预处理流程,将瑕疵提取出来。当然,对数学理论掌握程度较高的朋友,会推导理论公式,然后直接实现数学公式达到检测效果。
个人认为缺陷检测的难点:
1.传统算法检测缺陷:调试难度大,容易在检测不稳定情况下反复调参,且复杂缺陷误测多,兼容性差
2.机器学习检测缺陷:一般使用类似MLP的一些单层神经网络,对缺陷特征进行训练分类,该方法需要事先提取出缺陷部分,一般用来与传统分割法搭配使用,达到缺陷检测分类的效果。
3.深度学习检测缺陷(打标签):一般需要客户提供大量的缺陷样本,而且缺陷种类越多、特征越不明显,需要的缺陷样本就越大。其次,打标签过程很难做到自动,需要手动辅助框出缺陷位置,工作量非常大。总结就是训练周期久,训练样本大,如果客户可以提供大量样本,那该方法是首选(半导体行业一般不会出现大量缺陷样品)
4.深度学习检测缺陷(迁移学习法):该方法我感觉会成为后面工业领域检测瑕疵的一个大趋势,但是需要一些公司去收集各种行业的缺陷类型图片和训练的网络模型,并共享出来(突然感觉是个商机,就看谁能抓住了),然后我们可以使用迁移学习的方法学习别人训练好的模型。
---
参考文献
1、halcon机器视觉缺陷检测之划痕-超人视觉
http://www.ihalcon.com/read-8013.html
https://pan.baidu.com/share/link?shareid=3266393619&uk=2369503810
2、halcon缺陷检测的示例代码解析
https://blog.csdn.net/ymj7150697/category_8002603.html