QQ登录

只需一步,快速开始

4.5 halcon上位机检测划痕刮伤

[ 复制链接 ]
当前 帖子演示在非均匀光照的物体表面上实现缺陷,也就是刮伤划痕的检测。主要通过频域图像的滤波实现。
首先生成一个合适的带通滤波器,然后对图像进行快速傅立叶频域变换,并进行滤波处理,使高频信息加强。
最后将结果图上再转回空间域,用形态学方法对已经加载的缺陷进行处理。


下面是实现代码与注释

4.5 halcon上位机检测划痕刮伤

4.5 halcon上位机检测划痕刮伤

4.5 halcon上位机检测划痕刮伤

4.5 halcon上位机检测划痕刮伤

  1. dev_update_off ()
  2. dev_close_window ()
  3. read_image (Image, 'surface_scratch')
  4. *图像反转,也就是用255减去Image的每个像素灰度值,结果保存于ImageInverted
  5. invert_image (Image, ImageInverted)
  6. get_image_size (Image, Width, Height)
  7. dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
  8. set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
  9. dev_display (Image)
  10. *
  11. * Optimize the speed of the fast fourier transform
  12. * Message := 'Optimize the speed of the fast fourier transform.'
  13. * Message[1] := 'Please wait...'
  14. * disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
  15. * optimize_rft_speed (Width, Height, 'standard')
  16. * disp_continue_message (WindowHandle, 'black', 'true')
  17. * stop ()
  18. * 在频域用滤波器加强划痕
  19. *用正弦形状生成一个带通滤波器,ImageBandpass为输入图,0.4为滤波器最大距离。
  20. *滤波器常规因子为none,rtf为频域中心位置类型, Width, Height为图像宽高。
  21. *这里使用的算子组合与前面多个实例一样,也就是将图像转为频域图像,对频域图像进行滤波增加缺陷,将频域图转回空间域图
  22. gen_sin_bandpass (ImageBandpass, 0.4, 'none', 'rft', Width, Height)
  23. rft_generic (ImageInverted, ImageFFT, 'to_freq', 'none', 'complex', Width)
  24. convol_fft (ImageFFT, ImageBandpass, ImageConvol)
  25. rft_generic (ImageConvol, Lines, 'from_freq', 'n', 'byte', Width)
  26. * 使用形态学方法将划痕进行分隔。
  27. threshold (Lines, Region, 5, 255)
  28. connection (Region, ConnectedRegions)
  29. select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5, 5000)
  30. *用圆形结构元素进行膨胀处理,元素半径为5.5
  31. dilation_circle (SelectedRegions, RegionDilation, 5.5)
  32. union1 (RegionDilation, RegionUnion)
  33. reduce_domain (Image, RegionUnion, ImageReduced)
  34. *检测图像中线条与宽度,ImageReduced, LinesXLD为输入与输出图,高斯平滑系统为0.8
  35. *后滞阈值分隔低值高值为3,5.dark提取暗线条,false表示不提取线条宽度,bar-shaped提取线条 模式,'false'不添加能提取的结合点
  36. lines_gauss (ImageReduced, LinesXLD, 0.8, 3, 5, 'dark', 'false', 'bar-shaped', 'false')
  37. *将共线的轮廓连接起来,LinesXLD, UnionContours为输入输出图形,40表示沿被检测的轮廓回归线方向到另一
  38. *轮廓的端点距离 ,这个阈 值可接受 最大距离 为40,3为被检测轮廓长度,另一3为第二轮廓相对被检测轮廓 线的最大距离 。
  39. *测量是沿着回归线方向。0.2表示两个轮廓 回归线的夹角最大值。attr_keep表示 轮廓 属性模式。
  40. union_collinear_contours_xld (LinesXLD, UnionContours, 40, 3, 3, 0.2, 'attr_keep')
  41. *亚像素 特征提取用函数UnionContours, SelectedXLD为输入输出图形,'contlength'为特征类型表示提取轮廓长度特征。
  42. *and表示当有多个结果,全部选择提取。15,1000为特征的范围。
  43. select_shape_xld (UnionContours, SelectedXLD, 'contlength', 'and', 15, 1000)
  44. *根据XOD轮廓生成区域RegionXLD,'filled'为区域填充方式。
  45. gen_region_contour_xld (SelectedXLD, RegionXLD, 'filled')
  46. *联通多个区域为一个。
  47. union1 (RegionXLD, RegionUnion)
  48. *用圆形结构元素进行膨胀处理,元素半径为10.5
  49. dilation_circle (RegionUnion, RegionScratches, 10.5)
  50. *
  51. * 显示结果
  52. dev_set_draw ('margin')
  53. dev_set_line_width (3)
  54. dev_set_colored (12)
  55. dev_display (Image)
  56. dev_display (RegionScratches)
复制代码
频域空间域结合的思路是:
在频域主要是基于傅立叶变换 得到不同频段,进行频域滤波,增加区域,得到想得到的ROI.再反变换回空间域时进行继续处理,从而得到缺陷区域。


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索