缺陷检测是视觉需求中难度最大一类需求,主要是其稳定性和精度的保证。首先常见缺陷:凹凸、污点瑕疵、划痕、裂缝、探伤等。 缺陷检测算法不同于尺寸、二维码、OCR等算法。后者应用场景比较单一,基本都是套用一些成熟的算子,所以门槛较低,比较容易做成标准化的工具。而缺陷检测极具行业特点,不同行业的缺陷算法迥然不同。随着缺陷检测要求的提高,机器学习和深度学习也成了缺陷领域一个不可或缺的技术难点。

1. 传统算法检测缺陷:

调试难度大,容易在检测不稳定情况下反复调参,且复杂缺陷误测多,兼容性差

2. 机器学习检测缺陷:

一般使用类似MLP的一些单层神经网络,对缺陷特征进行训练分类,该方法需要事先提取出缺陷部分,一般用来与传统分割法搭配使用,达到缺陷检测分类的效果。

3. 深度学习检测缺陷(打标签):

一般需要客户提供大量的缺陷样本,而且缺陷种类越多、特征越不明显,需要的缺陷样本就越大。其次,打标签过程很难做到自动,需要手动辅助框出缺陷位置,工作量非常大。总结就是训练周期久,训练样本大,如果客户可以提供大量样本,那该方法是首选(半导体行业一般不会出现大量缺陷样品)

4. 深度学习检测缺陷(迁移学习法)

该方法我感觉会成为后面工业领域检测瑕疵的一个大趋势,但是需要一些公司去收集各种行业的缺陷类型图片和训练的网络模型,并共享出来(突然感觉是个商机,就看谁能抓住了),然后我们可以使用迁移学习的方法学习别人训练好的模型。

总的来说,机器视觉中缺陷检测分为一下几种:

blob分析+特征 模板匹配(定位)+差分 光度立体 特征训练 测量拟合 频域+空间域结合 深度学习

频域与空间域结合法

频域结合空间,其实频域就是用波动观点看世界,看问题角度变了,光经过镜头其实发生的是傅立叶变换,此思想在傅立叶光学上有所阐述,就像光经棱镜分光,而光进入计算机内部,进行了采样和量化,然后我们用函数f(x,y)来表示这些数据描述。图像处理应用傅里叶变换就是将空间域(图像本身)转换至频率域。傅里叶变换可以将一个信号函数,分解一个一个三角函数的线性组合。由于任何周期函数都可以由多个正弦函数构成,那么按照这个思想,图像由f(x,y)来表示,那么这时你就可以拆成多个正弦函数构成,这样每个正弦函数都有一个自己的频率。

频率特征是图像的灰度变化特征,低频特征是灰度变化不明显,例如图像整体轮廓,高频特征是图像灰度变化剧烈,如图像边缘和噪声。一个重要的经验结论:低频代表图像整体轮廓,高频代表了图像噪声,中频代表图像边缘、纹理等细节。

那么什么时候使用傅里叶变换进行频域分析?

1、具有一定纹理特征的图像,纹理可以理解为条纹,如布匹、木板、纸张等材质容易出现。 2、需要提取对比度低或者信噪比低的特征。 4、图像尺寸较大或者需要与大尺寸滤波器进行计算,这个案例可以看扩视机器视觉48项目34个,此时转换至频域计算,具有速度优势。因为空间域滤波为卷积过程(加权求和),频域计算直接相乘。

一般对于频域处理的方法有三种:

直接手画ROI区域,然后paint_regio(喷黑) 用滤波器(高通,低通,带通),然后进行滤波处理 调用power_real,对其进行blob分析。

## halcon相关案例分析:

1.脏污检测(低通滤波,差分,线提取)

塑料薄膜上有一些线条型的脏污,在空间域中向提取脏污的区域是比较困难的(方格会影响空间域的二值化),所以我们就想到了在频域中去处理它。

思路:

1、用calculate_lines_gauss_parameters函数计算Sigma和高低阈值(为后续lines_gauss提取脏污线痕做准备)

2、读入图片,将B空间转到频域

3、用高斯滤波器(低通滤波)进行滤波(即得到背景图像)

4、差分(原图——背景图),锐化图像

5、用lines_gauss提取脏污线痕

* 根据要提取的线的最大宽度和对比度,计算Sigma和高低阈值

calculate_lines_gauss_parameters (43.5, [25,5], Sigma, Low, High)

read_image (Image, 'D:/1.png')

* 这种脏污的提取可以考虑在频域中处理

* 让前景和背景分离,然后再提取脏污的区域

* 彩色图转灰度 这里拆通道更好,因为方格会影响脏污的提取

decompose3 (Image, R, G, B)

get_image_size(B, Width, Height)

* 空间域转频域

fft_generic (B, ImageFFT, 'to_freq', -1, 'none', 'dc_center', 'complex')

* 创建一个高斯滤波器/sigma越小滤波器越小,通过的信号更加的集中在低频,这样做的目的是得到背景

gen_gauss_filter (ImageGauss, 100, 100, 0, 'n', 'dc_center', Width, Height)

* 频域的乘法相当于空间域的卷积

convol_fft (ImageFFT, ImageGauss, ImageConvol)

* 频域转空间域

fft_generic (ImageConvol, ImageFFT1, 'from_freq', 1, 'none', 'dc_center', 'byte')

* 差分(原图 — 背景)

sub_image (B, ImageFFT1, ImageSub, 2, 100)

* 提取脏污的中心线

lines_gauss (ImageSub, Lines, Sigma, Low, High, 'dark', 'true', 'gaussian', 'true')

dev_display (B)

dev_display (Lines)

2.检测表面微小凸起(高斯差分,灰度差,二值化)

对于处理这种细微的缺陷,也可使用频域处理。 思路:

1、使用两个低通滤波器,进行相减后构造了一个带阻滤波器来提取缺陷分量

2、读入图像,灰度化,转频域,进行滤波,转回空间域

3、在空间域上blob分析

4、显示

该例程的关键就是使用两个低通滤波器,进行相减后构造了一个带阻滤波器来提取缺陷分量。通过带阻滤波后获得的频率成分对背景中的纹理要有明显的抑制,并且突出缺陷成分,在频域处理完成转会空间域之后,又用了一个能扩大亮点区域的函数:gray_range_rect 辅助后面的二值化,最终完成了缺陷的检测,这个函数可以说是点睛之笔。

dev_close_window ()

*1采集图像

read_image (Image, 'D:/1.png')

get_image_size (Image, Width, Height)

dev_open_window (0, 0, Width, Height, 'black', WindowHandle)

set_display_font (WindowHandle, 14, 'mono', 'true', 'false')

dev_set_draw ('margin')

dev_set_line_width (3)

dev_set_color ('red')

* 根据具体宽高,优化该图像的傅里叶变换速度(有此函数)

optimize_rft_speed (Width, Height, 'standard')

Sigma1 := 10.0

Sigma2 := 3.0

*形成高斯滤波器

gen_gauss_filter (GaussFilter1, Sigma1, Sigma1, 0.0, 'none', 'dc_center', Width, Height)

gen_gauss_filter (GaussFilter2, Sigma2, Sigma2, 0.0, 'none', 'dc_center', Width, Height)

*第一个滤波器减去第二个滤波器(形成带通滤波器)

sub_image (GaussFilter1, GaussFilter2, Filter, 1, 0)

*2进行频域滤波

rgb1_to_gray (Image, Image)

* 转到频域

fft_generic (Image, ImageFFT, 'to_freq', -1, 'none', 'dc_center', 'complex')

*滤波

convol_fft (ImageFFT, Filter, ImageConvol)

*返回空间域(实部)

fft_generic (ImageConvol, ImageFiltered, 'from_freq',1, 'n', 'dc_center', 'real')

*3空间域上的blob图像分割

*原图矩形内的灰度值范围(max-min)作为输出图像像素值,扩大了亮的部分

gray_range_rect (ImageFiltered, ImageResult, 10, 10)

* 获得图像最大灰度值和最小灰度值

min_max_gray (ImageResult, ImageResult, 0, Min, Max, Range)

*二值化提取( 5.55是经验值,在调试中得到)

threshold (ImageResult, RegionDynThresh, max([5.55,Max * 0.8]), 255)

select_shape (RegionDynThresh, SelectedRegions, 'area', 'and', 1, 99999)

connection (SelectedRegions, ConnectedRegions)

dev_display (Image)

count_obj (ConnectedRegions, Number)

for Index1 := 1 to Number by 1

select_obj (ConnectedRegions, ObjectSelected, Index1)

area_center (ObjectSelected, Area, Row, Column)

gen_circle_contour_xld (ContCircle, Row, Column, 20, 0, 6.28318, 'positive', 1)

dev_display (ContCircle)

endfor

3.检测磨砂表面的缺陷(高斯滤波差分,分水岭,灰度共生矩阵)

由于磨砂表面粗糙(噪点很多,影响二值化) 因此该例程使用了频域高斯滤波差分后,在空间域的blob分析用了分水岭域分割滤波后的图像,计算每个区域灰度共生矩阵,通过能量筛选缺陷。

dev_close_window ()

dev_update_off ()

read_image (Image, 'D:/1.png')

get_image_size (Image, Width, Height)

dev_open_window (0, 0, 640, 480, 'black', WindowHandle)

set_display_font (WindowHandle, 14, 'mono', 'true', 'false')

dev_set_draw ('margin')

dev_set_line_width (3)

dev_set_color ('red')

decompose3 (Image, R, G, B)

fft_generic (B, ImageFFT, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')

gen_gauss_filter (ImageGauss, 50, 50, 0, 'none', 'dc_center', Width, Height)

convol_fft (ImageFFT, ImageGauss, ImageConvol)

fft_generic (ImageConvol, ImageBackground, 'from_freq', 1, 'sqrt', 'dc_center', 'byte')

* 图像减去背景,增加特征与背景对比度

sub_image (B, ImageBackground, ImageSub, 2, 100)

* 中值滤波,为分水岭域做准备

median_image (ImageSub, ImageMedian, 'circle', 9, 'mirrored')

watersheds_threshold (ImageMedian, Basins, 20)

* 缺陷部分是黑色的,灰度值小能量就小,所以根据能量可以将缺陷的区域筛选出来

cooc_feature_image (Basins, ImageMedian, 6, 0, Energy, Correlation, Homogeneity, Contrast)

Mask := Energy [<=] 0.05

select_mask_obj (Basins, Defects, Mask)

dev_display (Image)

dev_display (Defects)

count_obj (Defects, NDefects)

disp_message (WindowHandle, NDefects + ' \'mura\' defects detected', 'window', 12, 12, 'red', 'true')

内容:对视觉检测的各种缺陷进行分类并使用相应的手法进行检测。

1.判断有无,缺料或多料(针对产品或杂质) 1)通过面积及灰度特征判断产品是否缺省和异类。Check_blister.hdev 2)通过全局阈值和动态阈值找杂质。Particle.hdev;芯片除尘 3)通过几个方向或不同光源的光照的图片,进行图像比对找出差异。board.hdev 4)通过彩色相机拍图,将图片分解为多个通道单独处理。lc.hdev 5)通过形状特征或尺寸判断产品异常。Check_bottle_crate.hdevcoun_fish_sticks.hdev Check hazelut wafers.hdev,checkfish_stick_dimension.hdev 2.于形状判断,通过模板匹配和区域差值确定异常 1)使用模板匹配进行缺料,混料,种类分拣等。Check_soft_cheese.hdev2)电阻字符缺陷检测。

3.位置度:偏移,角度,同心度,平面度 1)水印移印 4.产品边缘毛刺,缺省

扩视机器视觉 扩视,使用C++(linux)C#(windows)开发了大量视觉检测、运动控制、数据采集方面软件,具有丰富的非标自动化设备经验。授权16项视觉软件著作权;编写了《扩视机器视觉指导书》一书;开发了《48项目机器视觉实用教程》全套48实战项目,累计学员达800多人,累计学习人次1万余次;在电子发烧友等论坛发帖浏览量达5万人次;优酷发布的免费学习视频,累计播放量达1万余次,在视觉应用领域,首次利用C++(qt)Opencv开发了“XDvisionEditor”免编程视觉通用软件,目前已被多家自动化设备公司采购,累计销售量100多套。

好文推荐

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。