当前位置:   article > 正文

缺陷检测之划伤检测_棒表面划伤检测

棒表面划伤检测

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 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官方帮助文档
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/606254
推荐阅读
相关标签
  

闽ICP备14008679号