haclon中detect_indent_fft.hdev程序

使用实值傅里叶变换图像与组合高斯滤波器卷积,计算滤波图像的灰度值范围gray_range_rect,通过灰度阈值检测塑料表面小凹点。

原代码的步骤为
1.设置窗口基本属性
2.设置高斯滤波器(两个Sigma不同的高斯滤波器进行相减)
3.对图片实部进行快速傅里叶变换,用设置好的高斯滤波器进行对频域进行滤波,对滤波后的图片进行傅里叶反变换
4.用一个矩形掩膜计算像素点的灰度范围(gray_range_rect),利用全局阈值对图像进行分割,计算区域的面积以及中心位置
5.检查是否存在缺陷

对于程序主要步骤中地方看法:
2.设置高斯滤波器(两个Sigma不同的高斯滤波器进行相减)
3.对图片实部进行快速傅里叶变换,用设置好的高斯滤波器进行对频域进行滤波,对滤波后的图片进行傅里叶反变换
Sigma1=10,生成大半径二维高斯,频域上是一个中间亮,向外慢慢衰减的圆盘。
Sigma2=3,生成小半径二维高斯,更小的亮圆盘。
大圆盘 − 小圆盘 = 环形环状滤波器(sub_image)

待检测原图
屏幕截图 2026-10-15 072035

我用Sigma=10的高斯滤波器进行对速傅里叶变换后的频域进行滤波,发现过头,细节丢失严重。
屏幕截图 2026-10-15 072135

用Sigma=3的高斯滤波器进行对速傅里叶变换后的频域进行滤波,发现对程序中图片都可以正常检查出来。
屏幕截图 2026-10-15 072218
用环形环状滤波器
屏幕截图 2026-10-15 072320
发现用环形环状滤波器,有很好的对背景的黑色影响因素进行过滤。
不过用环形环状滤波器和用Sigma=3的高斯滤波器对缺陷的提取出的黑白点位置两个是相反的(目前不知是什么原因,懂得请评论一下,感谢大佬),但不影响最终结果

4.用一个矩形掩膜计算像素点的灰度范围(gray_range_rect),利用全局阈值对图像进行分割,计算区域的面积以及中心位置
主要算子为gray_range_rect
历图像每一个像素,以当前像素为中心开一个矩形窗口
计算窗口内:灰度最大值 − 灰度最小值 = 极差(Range)

  • 窗口内灰度很均匀(干净背景):max-min 很小 → 输出像素灰度很低(发黑)
  • 窗口内有明暗变化(缺陷、划痕、斑点):max-min 很大 → 输出像素灰度很高(发白)

在做圆圈时,用了一个gen_tuple_const(Number,30)
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)
屏幕截图 2026-10-15 074844
其中gen_tuple_const初始化矩阵
gen_tuple_const(Number,30) //创建一个具有Number个元素的,每个元素都为30的数据

原代码:

  • Initializations
    dev_update_off ()
    dev_close_window ()
    read_image (Image, 'plastics/plastics_01')
    get_image_size (Image, Width, Height)
    dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
    set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
    dev_set_draw ('margin')
    dev_set_line_width (3)
    dev_set_color ('red')
  • Optimize the fft speed for the specific image size
    optimize_rft_speed (Width, Height, 'standard')
  • Construct a suitable filter by combining two Gaussian
  • filters
    Sigma1 := 10.0
    Sigma2 := 3.0
    gen_gauss_filter (GaussFilter1, Sigma1, Sigma1, 0.0, 'none', 'rft', Width, Height)
    gen_gauss_filter (GaussFilter2, Sigma2, Sigma2, 0.0, 'none', 'rft', Width, Height)
    sub_image (GaussFilter1, GaussFilter2, Filter, 1, 0)
  • Process the images iteratively
    NumImages := 11
    for Index := 1 to NumImages by 1
    *
    • Read an image and convert it to gray values
      read_image (Image, 'plastics/plastics_' + Index$'02')
      rgb1_to_gray (Image, Image)
    • Perform the convolution in the frequency domain
      rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)
      convol_fft (ImageFFT, Filter, ImageConvol)
      rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width)
    • Process the filtered image
      gray_range_rect (ImageFiltered, ImageResult, 10, 10)
      min_max_gray (ImageResult, ImageResult, 0, Min, Max, Range)
      threshold (ImageResult, RegionDynThresh, max([5.55,Max * 0.8]), 255)
      connection (RegionDynThresh, ConnectedRegions)
      select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 4, 99999)
      union1 (SelectedRegions, RegionUnion)
      closing_circle (RegionUnion, RegionClosing, 10)
      connection (RegionClosing, ConnectedRegions1)
      select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 10, 99999)
      area_center (SelectedRegions1, Area, Row, Column)
    • Display the results
      dev_display (Image)
      Number := |Area|
      if (Number)
      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)
      ResultMessage := ['Not OK',Number + ' defect(s) found']
      Color := ['red', 'black']
      dev_display (ContCircle)
      else
      ResultMessage := 'OK'
      Color := 'forest green'
      endif
      disp_message (WindowHandle, ResultMessage, 'window', 12, 12, Color, 'true')
      if (Index != NumImages)
      disp_continue_message (WindowHandle, 'black', 'true')
      stop ()
      endif
      endfor
posted @ 2026-10-15 07:51  昵称是刘先生  阅读(2)  评论(0)    收藏  举报