缺陷检测之划伤检测

1、代码

本程序演示了如何通过频域滤波检测非均匀照明表面的缺陷(划痕)。

首先,创建一个合适的带通滤波器。然后对输入图像进行傅里叶变换,在频域中进行滤波,增强高频信息。最后将其转化为空间域,对增强后的缺陷进行形态学后处理。


* 关闭更新
dev_update_off ()
dev_close_window ()
* 读取图像
read_image (Image, 'surface_scratch')
* 图像反转
invert_image (Image, ImageInverted)
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_display (Image)
* 
* 优化快速傅里叶变换的速度
* Message := 'Optimize the speed of the fast fourier transform.'
* Message[1] := 'Please wait...'
* disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
* optimize_rft_speed (Width, Height, 'standard')
* disp_continue_message (WindowHandle, 'black', 'true')
* stop ()
* 
* 在频率域通过滤波实现图像划伤增强
* 生成正弦带通滤波器
gen_sin_bandpass (ImageBandpass, 0.4, 'none', 'rft', Width, Height)
* 快速傅里叶变换
rft_generic (ImageInverted, ImageFFT, 'to_freq', 'none', 'complex', Width)
* 图像卷积
convol_fft (ImageFFT, ImageBandpass, ImageConvol)
* 快速傅里叶变换,转换图像到空间域及byte类型
rft_generic (ImageConvol, Lines, 'from_freq', 'n', 'byte', Width)
* 
* 通过形态学实现划伤分割
threshold (Lines, Region, 5, 255)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5, 5000)
dilation_circle (SelectedRegions, RegionDilation, 5.5)
union1 (RegionDilation, RegionUnion)
reduce_domain (Image, RegionUnion, ImageReduced)
lines_gauss (ImageReduced, LinesXLD, 0.8, 3, 5, 'dark', 'false', 'bar-shaped', 'false')
union_collinear_contours_xld (LinesXLD, UnionContours, 40, 3, 3, 0.2, 'attr_keep')
select_shape_xld (UnionContours, SelectedXLD, 'contlength', 'and', 15, 1000)
gen_region_contour_xld (SelectedXLD, RegionXLD, 'filled')
union1 (RegionXLD, RegionUnion)
dilation_circle (RegionUnion, RegionScratches, 10.5)
* 
* Display the results
dev_set_draw ('margin')
dev_set_line_width (3)
dev_set_colored (12)
dev_display (Image)
dev_display (RegionScratches)

2、结果

源图这里写图片描述这里写图片描述这里写图片描述这里写图片描述

3、算子

  • invert_image(Image : ImageInvert : : )对图像进行反转
    这里写图片描述

  • gen_sin_bandpass( : ImageFilter : Frequency, Norm, Mode, Width, Height : )生成正弦带通滤波器

    该函数生成一个在频率域具有旋转不变性的正弦带通滤波器。该sin函数的最大值由Frequency决定。Norm指定滤波归一化的参数,以实现滤波效率的最大化。fft_generic和Norm = ‘n’ 的应用,FFT将避免归一化。Mode用来确定滤波器中的DC项或者是否应该在实数值FFT中应用滤波。若应用 fft_generic ,‘dc_edge’ 将有更好的效率。若应用fft_image 和fft_image_inv进行滤波,则必须应用Norm = ‘none’ 和Mode =‘dc_center’ 。若应用rft_generic ,则Mode必须为Mode = ‘rft’。滤波值,对于DC项始终为0,在sin函数值达到Frequency前一直增加,当高于Frequency时下降。sin函数值范围为0到pi。其他点都设置为0.(该段为自己翻译,若有误或理解不透,请留言指正!谢谢
    这里写图片描述

  • connection(Region : ConnectedRegions : : )计算区域的连通域

    例:

    read_image(Image,'clip')
    dev_set_colored(12)
    threshold(Image,Dark,0,150)
    count_obj(Dark,NumThresholded)
    dev_display (Dark)
    connection(Dark,ConnectedRegions)
    count_obj(ConnectedRegions,NumConnected)
    dev_display (ConnectedRegions)
    
  • lines_gauss(Image : Lines : Sigma, Low, High, LightDark, ExtractWidth, LineModel, CompleteJunctions : )计算直线及其宽度
    这里写图片描述这里写图片描述

  • union_collinear_contours_xld(Contours : UnionContours : MaxDistAbs, MaxDistRel, MaxShift, MaxAngle, Mode : )合并近似共线的直线

  • select_shape_xld(XLD : SelectedXLD : Features, Operation, Min, Max : )根据特征选取亚像素进度的轮廓

  • gen_region_contour_xld(Contour : Region : Mode : )由亚像素精度的轮廓生成区域

4、参考

  • Halcon官方帮助文档
  • 8
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值