当前帖子实例实现在塑料产品上检测微小纹理缺陷。
使用的方法是快速傅里叶变换。
实现思路首先是创建一个合适的高斯滤波器,然后对图像与滤波器进行快速傅立叶卷积运算。
最后在滤波后的图片上形态学算子检测缺陷。
有几个名词解释fft:Fast Fourier Transformation
即为快速傅氏变换,是离散傅氏变换(DFT)的快速算法,
它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。
rft:real-valued fast Fourier transform
4.2 halcon 上位机实现塑料表面缺陷检测
下面是源代码及注释
- 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')
- * 对指定大小的图片进行FFT速度优化。
- optimize_rft_speed (Width, Height, 'standard')
- * 生成两个高斯滤波器,GaussFilter1为生成的高斯滤波器,
- *Sigma1, Sigma1为空间域中高斯滤波器在主方向 生成的标准差和正交于主方向上的标准差,
- *0.0滤波器主方向上的角度, 'none'滤波器规范, 'rft'直流 频域 的位置, Width, Height图像宽高。
- 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)
- *两图像相减。将GaussFilter1, GaussFilter2的灰度值相减后乘以1加0,结果保存到Filter。
- sub_image (GaussFilter1, GaussFilter2, Filter, 1, 0)
- NumImages := 11
- for Index := 1 to NumImages by 1
- read_image (Image, 'plastics/plastics_' + Index
- 02')
- rgb1_to_gray (Image, Image)
- *计算图像的快速傅立叶变换 ,也就是频域变换,Image为输入图像,
- *ImageFFT为变换后的图像, 'to_freq'表示 从空间域到频域变换,为正向变换。
- *对应的是从频域到空间域的逆向变换, 'none'变换规范因数为无, 'complex'表示复数类型,
- *Width表示图像宽度。
- rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)
- *采用滤波器在频域上做卷积。
- convol_fft (ImageFFT, Filter, ImageConvol)
- *频域 回到空间域。
- rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width)
- * 用矩形掩膜计算像素点灰度范围
- gray_range_rect (ImageFiltered, ImageResult, 10, 10)
- *判断 区内 灰度值 的最大最小值,第三个参数表示小于(大于)绝对最大(最小)值 的百分比值。
- *如为50表示Min,Max等于中间值,如为0将没有直方图被代入计算,可提高运算速度 。
- *后面三参数表示 最大最小值及它们的差。
- min_max_gray (ImageResult, ImageResult, 0, Min, Max, Range)
- threshold (ImageResult, RegionDynThresh, max([5.55,Max * 0.8]), 255)
- connection (RegionDynThresh, ConnectedRegions)
- *选取面积在4--99999范围内区域。
- 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)
- * 结果显示
- 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
复制代码
|