Halcon学习笔记之缺陷检测(二)

例程:detect_indent_fft.hdev


说明:这个程序展示了如何利用快速傅里叶变换(FFT)对塑料制品的表面进行目标(缺陷)的检测,大致分为三步:

首先,我们用高斯滤波器构造一个合适的滤波器(将原图通过高斯滤波器滤波);

然后,将原图和构造的滤波器进行快速傅里叶变换;

最后,利用形态学算子将缺陷表示在滤波后的图片上(在缺陷上画圈)。

注:代码中绿色部分为个人理解和注释,其余为例程中原有代码

* 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')
* 
* 根据指定图像大小进行fft速度最优化
optimize_rft_speed (Width, Height, 'standard')
* 
* 结合两个高斯滤波器构造一个合适的滤波器
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)
* 
* 对图像进行迭代运算
NumImages := 11
for Index := 1 to NumImages by 1
    * 
    * 将原图转化为灰度图
    read_image (Image, 'plastics/plastics_'+Index$'02')
    rgb1_to_gray (Image, Image)
    * 对计算一幅图片实部进行快速傅里叶变换
    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)
    *判断区域内灰度值的最大和最小值
    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


算法讲解:在实际的表面缺陷检测系统中,针对的检测表面很多是具有一定纹理的比如:布匹、皮革、塑料等,针对这一类表面的检测就不能单纯依靠帧差或者背景差来完成,因为背景的纹理不可能和当前图像的纹理完全相同。因此,本例程的算法通过将图像变换到频域进行处理,提取缺陷分量后反变换到时域,获得缺陷的具体位置。


高斯滤波器:在本算法中,在一开始就构造了两个高斯滤波器,高斯滤波器是一种线性平滑滤波器,适用于消除高斯噪声。滤波器的实质是对信号进行滤波,滤除不需要的部分,得到想要的部分。一个低通的滤波器可以滤除高频信号,对于图像来说,噪声和边缘往往集中在高频分量,因此低通能够降噪,但是也能造成图像的模糊。


本文关键:本文的关键就是使用两个低通滤波器,进行相减后构造了一个带阻滤波器来提取缺陷分量。这就需要保证在实际的待检测表面中缺陷所处的频率范围要和背景以及噪声有明显的差异,并且带阻的频率选择要合适。通过带阻滤波后获得的频率成分对背景中的纹理要有明显的抑制,并且突出缺陷成分,进行傅里叶反变换后重构的图像就是缺陷图像,经过简单的分割就能很容易得到缺陷了。


image.png  image.png


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864