当前这个例程是在非均匀光照的物体表面上实现缺陷,也就是刮伤划痕的检测。
主要通过频域图像的滤波实现。
首先生成一个合适的带通滤波器,
然后对图像进行快速傅立叶频域变换,
并进行滤波处理,使高频信息加强。
最后将结果图上再转回空间域,用形态学方法对已经加载的缺陷进行处理
下面是实例,
可以复制到Halcon运行查看效果。
工业视觉halcon物体表面划痕刮伤检测
dev_update_off ()
dev_close_window ()
read_image (Image, 'surface_scratch')
*图像反转,也就是用255减去Image的每个像素灰度值,结果保存于ImageInverted
invert_image (Image, ImageInverted)
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_display (Image)
*
* Optimize the speed of the fast fourier transform
* Message := 'Optimize the speed of the fast fourier transform.'
* Message[1] := 'Please wait...'
* disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
* optimize_rft_speed (Width, Height, 'standard')
* disp_continue_message (WindowHandle, 'black', 'true')
* stop ()
* 在频域用滤波器加强划痕
*用正弦形状生成一个带通滤波器,ImageBandpass为输入图,0.4为滤波器最大距离。
*滤波器常规因子为none,rtf为频域中心位置类型, Width, Height为图像宽高。
*这里使用的算子组合与前面多个实例一样,也就是将图像转为频域图像,对频域图像进行滤波增加缺陷,将频域图转回空间域图
gen_sin_bandpass (ImageBandpass, 0.4, 'none', 'rft', Width, Height)
rft_generic (ImageInverted, ImageFFT, 'to_freq', 'none', 'complex', Width)
convol_fft (ImageFFT, ImageBandpass, ImageConvol)
rft_generic (ImageConvol, Lines, 'from_freq', 'n', 'byte', Width)
* 使用形态学方法将划痕进行分隔。
threshold (Lines, Region, 5, 255)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5, 5000)
*用圆形结构元素进行膨胀处理,元素半径为5.5
dilation_circle (SelectedRegions, RegionDilation, 5.5)
union1 (RegionDilation, RegionUnion)
reduce_domain (Image, RegionUnion, ImageReduced)
*检测图像中线条与宽度,ImageReduced, LinesXLD为输入与输出图,高斯平滑系统为0.8
*后滞阈值分隔低值高值为3,5.dark提取暗线条,false表示不提取线条宽度,bar-shaped提取线条 模式,'false'不添加能提取的结合点
lines_gauss (ImageReduced, LinesXLD, 0.8, 3, 5, 'dark', 'false', 'bar-shaped', 'false')
*
将共线的轮廓连接起来,LinesXLD, UnionContours为输入输出图形,40表示沿被检测的轮廓回归线方向到另一
*轮廓的端点距离 ,这个阈 值可接受 最大距离 为40,3为被检测轮廓长度,另一3为第二轮廓相对被检测轮廓 线的最大距离 。
*测量是沿着回归线方向。0.2表示两个轮廓 回归线的夹角最大值。attr_keep表示 轮廓 属性模式。
union_collinear_contours_xld (LinesXLD, UnionContours, 40, 3, 3, 0.2, 'attr_keep')
*亚像素 特征提取用函数UnionContours, SelectedXLD为输入输出图形,'contlength'为特征类型表示提取轮廓长度特征。
*and表示当有多个结果,全部选择提取。15,1000为特征的范围。
select_shape_xld (UnionContours, SelectedXLD, 'contlength', 'and', 15, 1000)
*根据XOD轮廓生成区域RegionXLD,'filled'为区域填充方式。
gen_region_contour_xld (SelectedXLD, RegionXLD, 'filled')
*联通多个区域为一个。
union1 (RegionXLD, RegionUnion)
*用圆形结构元素进行膨胀处理,元素半径为10.5
dilation_circle (RegionUnion, RegionScratches, 10.5)
*
* 显示结果
dev_set_draw ('margin')
dev_set_line_width (3)
dev_set_colored (12)
dev_display (Image)
dev_display (RegionScratches)
文章为下面HALCON视频教程的部分内容,
可以下载教程观看学习。
上位机VC MFC程序开发精典实例大全源码与视频讲解配套下载408例 经历1年的编程与录制点击进入查看
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|