当前 帖子演示在非均匀光照的物体表面上实现缺陷,也就是刮伤划痕的检测。主要通过频域图像的滤波实现。
首先生成一个合适的带通滤波器,然后对图像进行快速傅立叶频域变换,并进行滤波处理,使高频信息加强。
最后将结果图上再转回空间域,用形态学方法对已经加载的缺陷进行处理。
下面是实现代码与注释
4.5 halcon上位机检测划痕刮伤
4.5 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)
复制代码 频域空间域结合的思路是:
在频域主要是基于傅立叶变换 得到不同频段,进行频域滤波,增加区域,得到想得到的ROI.再反变换回空间域时进行继续处理,从而得到缺陷区域。
|