表面缺陷检测在工业 视觉领域也很常见,包括物品表面划伤,缺损,污垢,变形等各种各样的缺陷,
这些对于 工业 产品来说都是不合格的。采用传统人工方式检查非常耗费人力物力。
也容易让人视觉疲劳以及误判。
采用机器 视觉的方式 可以提高 检测 效率,长时间连续工作。
对于 表面缺陷我们常用 的检测 思路 有blob分析方法及blob与纹理配合检测法,
频域空间域配合检测法,
光度立体 法等。
第一思路 是基于blob分析方法进行缺陷检测,就是利用二值化,形状特征选择,形态学联合应用,
再加上图像区域加减运算,逐渐逼近缺陷区域 ,最终得到缺陷并显示出来。
Blob分析 是最常用最灵活的方法,可以采用不同顺序,加上其他算法的结合,达到比较好的缺陷效果
频域与空间域结合的方法主要就是在频域里进行滤波,选择不同的频域,然后再回到空间域处理,从而得到缺陷所在区域
当前例程实现在塑料产品上检测微小纹理缺陷,使用的方法是快速傅里叶变换。
实现思路首先是创建一个合适的高斯滤波器,然后对图像及滤波器进行快速傅立叶卷积运算。
最后在滤波后的图片上形态学算子检测缺陷。
实例,可运行查看效果。
工业视觉halcon塑料表面缺陷检测
dev_close_window ()
read_image (Image, 'plastics/plastics_01')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
stop()
* 对指定大小的图片进行FFT速度优化
optimize_rft_speed (Width, Height, 'standard')
* 生成两个高斯滤波器,GaussFilter1为生成的高斯滤波器,
*Sigma1, Sigma1为空间域中高斯滤波器在主方向 生成的标准差和正交于主方向上的标准差,
*0.0滤波器主方向上的角度, 'none'滤波器规范, 'rft'直流 频域 的位置, Width, Height图像宽高。
gen_gauss_filter (ImageGauss, 10, 10, 0, 'none', 'rft', Width, Height)
gen_gauss_filter (ImageGauss1, 3, 3, 0, 'none', 'rft', Width, Height)
*两图像相减。将GaussFilter1, GaussFilter2的灰度值相减后乘以1加0,结果保存到Filter。
sub_image (ImageGauss, ImageGauss1, filter, 1, 0)
num := 11
for i := 1 to num by 1
read_image (Image1, 'plastics/plastics_'+i$'02')
rgb1_to_gray (Image1, GrayImage)
*计算图像的快速傅立叶变换 ,也就是频域变换,Image为输入图像,
*ImageFFT为变换后的图像, 'to_freq'表示 从空间域到频域变换,为正向变换。
*对应的是从频域到空间域的逆向变换, 'none'变换规范因数为无, 'complex'表示复数类型,
*Width表示图像宽度。
rft_generic (GrayImage, ImageFFT, 'to_freq', 'none', 'complex', Width)
*采用滤波器在频域上做卷积。
convol_fft (ImageFFT, filter, ImageConvol)
*频域 回到空间域。
rft_generic (ImageConvol, ImageFFT1, 'from_freq', 'n', 'real', Width)
* 用矩形掩膜计算像素点灰度范围
gray_range_rect (ImageFFT1, ImageResult, 10, 10)
*判断 区内 灰度值 的最大最小值,第三个参数表示小于(大于)绝对最大(最小)值 的百分比值。
*如为50表示Min,Max等于中间值,如为0将没有直方图被代入计算,可提高运算速度 。
*后面三参数表示 最大最小值及它们的差。
min_max_gray (ImageResult, ImageResult, 0, Min, Max, Range)
threshold (ImageResult, Region, max([5,Max*0.8]), 255)
connection (Region, ConnectedRegions)
*选取面积在4--99999范围内区域。
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 4, 99999)
area_center (SelectedRegions, Area, Row, Column)
*结果显示
dev_display (Image1)
num := |Area|
if (num)
gen_circle_contour_xld (ContCircle, Row, Column, gen_tuple_const(num,30), gen_tuple_const(num,0), gen_tuple_const(num,rad(360)), 'positive', 1)
Message := ['not ok',num$'02'+'defects found']
dev_display (ContCircle)
else
Message :='OK'
endif
dev_disp_text (Message, 'window', 10, 10, 'black', [], [])
stop()
endfor
文章也下面HALCON视频教程的部分内容,
可以下载教程观看学习。
上位机VC MFC程序开发精典实例大全源码与视频讲解配套下载408例 经历1年的编程与录制点击进入查看
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|