halcon表面检测3——如何使用快速傅立叶变换(FFT)检测塑料物品表面的细小纹理缺陷(detect_indent_fft)

该程序演示了如何检测小纹理
*通过使用快速塑料制品表面的缺陷
*傅立叶变换(FFT)。

首先,我们使用高斯滤波器构造一个合适的滤波器。
然后,通过使用快速傅立叶变换对图像和滤波器进行卷积。
最后,使用形态学算子在滤波后的图像中检测出缺陷**

在这里插入图片描述

*该程序演示如何检测小纹理
*通过使用快速傅立叶变换(FFT)在塑料制品的表面上形成缺陷。

*首先,我们使用高斯滤波器构造一个合适的滤波器。
*然后,通过使用快速傅立叶变换对图像和滤镜进行卷积。
*最后,使用形态算子在过滤后的图像中检测出缺陷。
* 
* 初始化
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)
    * 
    * 显示结果
    dev_display (Image)
    Number := |Area|
    if (Number)
        *创建与圆或圆弧相对应的XLD轮廓
        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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

航天子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值