QQ登录

只需一步,快速开始

4.2 halcon 上位机实现塑料表面缺陷检测

[ 复制链接 ]
当前帖子实例实现在塑料产品上检测微小纹理缺陷。
使用的方法是快速傅里叶变换。
实现思路首先是创建一个合适的高斯滤波器,然后对图像与滤波器进行快速傅立叶卷积运算。
最后在滤波后的图片上形态学算子检测缺陷。

有几个名词解释fft:Fast Fourier Transformation
即为快速傅氏变换,是离散傅氏变换(DFT)的快速算法,
它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。

rft:real-valued fast Fourier transform

4.2 halcon 上位机实现塑料表面缺陷检测

4.2 halcon 上位机实现塑料表面缺陷检测

下面是源代码及注释


  1. dev_update_off ()
  2. dev_close_window ()
  3. read_image (Image, 'plastics/plastics_01')
  4. get_image_size (Image, Width, Height)
  5. dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
  6. set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
  7. dev_set_draw ('margin')
  8. dev_set_line_width (3)
  9. dev_set_color ('red')
  10. * 对指定大小的图片进行FFT速度优化。
  11. optimize_rft_speed (Width, Height, 'standard')
  12. * 生成两个高斯滤波器,GaussFilter1为生成的高斯滤波器,
  13. *Sigma1, Sigma1为空间域中高斯滤波器在主方向 生成的标准差和正交于主方向上的标准差,
  14. *0.0滤波器主方向上的角度, 'none'滤波器规范, 'rft'直流 频域 的位置, Width, Height图像宽高。
  15. Sigma1 := 10.0
  16. Sigma2 := 3.0
  17. gen_gauss_filter (GaussFilter1, Sigma1, Sigma1, 0.0, 'none', 'rft', Width, Height)
  18. gen_gauss_filter (GaussFilter2, Sigma2, Sigma2, 0.0, 'none', 'rft', Width, Height)
  19. *两图像相减。将GaussFilter1, GaussFilter2的灰度值相减后乘以1加0,结果保存到Filter。
  20. sub_image (GaussFilter1, GaussFilter2, Filter, 1, 0)
  21. NumImages := 11
  22. for Index := 1 to NumImages by 1
  23.     read_image (Image, 'plastics/plastics_' + Index

  24. 02')
  25.     rgb1_to_gray (Image, Image)
  26.     *计算图像的快速傅立叶变换 ,也就是频域变换,Image为输入图像,
  27.     *ImageFFT为变换后的图像, 'to_freq'表示 从空间域到频域变换,为正向变换。
  28.     *对应的是从频域到空间域的逆向变换, 'none'变换规范因数为无, 'complex'表示复数类型,
  29.     *Width表示图像宽度。
  30.     rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)
  31.     *采用滤波器在频域上做卷积。
  32.     convol_fft (ImageFFT, Filter, ImageConvol)
  33.     *频域 回到空间域。
  34.     rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width)
  35.     * 用矩形掩膜计算像素点灰度范围
  36.     gray_range_rect (ImageFiltered, ImageResult, 10, 10)
  37.     *判断 区内 灰度值 的最大最小值,第三个参数表示小于(大于)绝对最大(最小)值 的百分比值。
  38.     *如为50表示Min,Max等于中间值,如为0将没有直方图被代入计算,可提高运算速度 。
  39.     *后面三参数表示 最大最小值及它们的差。
  40.     min_max_gray (ImageResult, ImageResult, 0, Min, Max, Range)
  41.     threshold (ImageResult, RegionDynThresh, max([5.55,Max * 0.8]), 255)
  42.     connection (RegionDynThresh, ConnectedRegions)
  43.     *选取面积在4--99999范围内区域。
  44.     select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 4, 99999)
  45.     *将多区域联合成一个
  46.     union1 (SelectedRegions, RegionUnion)
  47.     closing_circle (RegionUnion, RegionClosing, 10)
  48.     connection (RegionClosing, ConnectedRegions1)
  49.     select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 10, 99999)
  50.     area_center (SelectedRegions1, Area, Row, Column)
  51.     * 结果显示
  52.     dev_display (Image)
  53.     Number := |Area|
  54.     if (Number)
  55.         gen_circle_contour_xld (ContCircle, Row, Column, gen_tuple_const(Number,30), gen_tuple_const(Number,0), gen_tuple_const(Number,rad(360)), 'positive', 1)
  56.         ResultMessage := ['Not OK',Number + ' defect(s) found']
  57.         Color := ['red','black']
  58.         dev_display (ContCircle)
  59.     else
  60.         ResultMessage := 'OK'
  61.         Color := 'forest green'
  62.     endif
  63.     disp_message (WindowHandle, ResultMessage, 'window', 12, 12, Color, 'true')
  64.     if (Index != NumImages)
  65.         disp_continue_message (WindowHandle, 'black', 'true')
  66.         stop ()
  67.     endif
  68. endfor
复制代码



回复

使用道具 举报

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