halcon裂纹缺陷检测

针对这一类表面的检测就不能单纯依靠帧差或者背景差来完成,因为背景的纹理不可能和当前图像的纹理完全相同。

方法一—局部阈值分割

一、局部阈值分割

1、dyn_threshold–局部阈值分割

dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : )

参数一:OrigImage (input_object)
需要进行阈值分割的原始图像

参数二:ThresholdImage (input_object)
通过一定图像预处理得到的阈值图像(这个预处理通常是对原图应用mean_image/gauss_image/binomial_filter 处理后的图像)

参数三:RegionDynThresh (output_object)
对原图进行阈值分割后输出图像

参数四:Offset (input_control) number
是一个阈值调节值,在做对比时,需要和ThresholdImage上某一点像素值同时作用
Default value: 5.0
Suggested values: 1.0, 3.0, 5.0, 7.0, 10.0, 20.0, 30.0
Typical range of values: -255.0 ≤ Offset ≤ 255.0 (lin)

Minimum increment: 0.01
Recommended increment: 5
Restriction: -255 < Offset && Offset < 255

参数五:LightDark (input_control)
是一个关键选择,’dark’, ‘light’, ‘equal’, ‘not_equal’一共有4种选择,明、暗、同、不同
Default value: ‘light’
List of values: ‘dark’, ‘equal’, ‘light’, ‘not_equal’

2、程序部分

* 关闭更新
dev_update_off ()
dev_close_window ()
* 读取图像
read_image (Image, 'D:/Halocn files/裂纹/surface_scratch')


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)

dev_set_draw ('margin')
dev_set_line_width (4)

*平滑
mean_image (Image, ImageMean, 7, 7)
*使用局部阈值分割图像
dyn_threshold (Image, ImageMean, DarkPixels, 5, 'dark')


connection (DarkPixels, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10, 1000)

dev_display (Image)
dev_display (SelectedRegions)

union1 (SelectedRegions, RegionUnion)
dilation_circle (RegionUnion, RegionDilation, 3.5)

skeleton (RegionDilation, Skeleton)
connection (Skeleton, Errors)

select_shape (Errors, Scratches, 'area', 'and', 50, 10000)
select_shape (Errors, Dots, 'area', 'and', 1, 50)
dev_display (Image)
dev_set_color ('red')
dev_display (Scratches)

-------------------原图----------------------------------------平滑------------------------------局部阈值---------------------
在这里插入图片描述
结果
在这里插入图片描述

方法二—傅里叶变换+bool分析

一、滤波器

空间域和频域滤波器通常分为四种类型的滤波器——低通、高通、带阻和带通滤波器。
在这里插入图片描述
坐标越接近原点条纹越粗–低频
坐标轴靠右或下条纹越细—高频

在这里插入图片描述
低通–没有细节只有主体
高通–有细节没有主体

1、gen_sin_bandpass–正弦带通滤波器

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.

参数一:ImageFilter (output_object)
带通滤波器作为图像的频域。
Default value: 0.1
Suggested values: 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0
Restriction: Frequency >= 0

参数二:Frequency (input_control)
滤波器最大值到直流项的距离。
Default value: ‘none’
List of values: ‘n’, ‘none’

参数三:Norm (input_control)
滤波器的归一化因子。
Default value: ‘dc_center’
List of values: ‘dc_center’, ‘dc_edge’, ‘rft’
例如我要进行rft_generic的变换,那么我的高斯滤波器模式就要写为‘rft’。

参数四:Width (input_control)
图像(滤镜)的宽度。

参数四:Height (input_control)
图像(滤镜)的高度。

2、rft_generic—计算图像的实值快速傅里叶变换

一般需要使用两次,因为在频域处理完之后,还需要转换成空间域。
rft_generic(Image : ImageFFT : Direction, Norm, ResultType, Width : )

参数一:Image:输入图像
参数二:ImageFFT(out) :傅里叶变换输入图像
参数三:Direction:计算正向或反向变换。‘to_freq’是空间域—>频域的变换,ResultType一般选择’complex’;‘from_freq’是频域—>空间域的变换,ResultType一般选择’byte’(灰度图像)。
参数四:Norm:变换的归一化因子
参数五:ResultType:输出图像的图像类型,配合Direction参数设置
Width :输入图像的宽度

3、程序部分

* 关闭更新
dev_update_off ()
dev_close_window ()
* 读取图像
read_image (Image, 'D:/Halocn files/裂纹/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)
* 
* 优化快速傅里叶变换的速度
* 首先,创建一个合适的带通滤波器。
*然后对输入图像进行傅里叶变换,在频域中进行滤波,增强高频信息。
*最后将其转化为空间域,对增强后的缺陷进行形态学后处理。
* 在频率域通过滤波实现图像划伤增强
* 生成正弦带通滤波器--可以去除图像中的噪声。然后傅里叶变换凸显出要检测的划痕。
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)

---------------原图反转------------------------------------带通滤波-----------------------------快速傅里叶变换---------在这里插入图片描述------------------卷积----------------------------------频域转空间域-----------------------------------结果-----------------在这里插入图片描述
频域转空间域放大图
在这里插入图片描述

方法三—高斯滤波差分+bool分析

1、gen_gauss_filter–高斯滤波

gen_gauss_filter( : ImageGauss : Sigma1, Sigma2, Phi, Norm, Mode, Width, Height : )

参数一:ImageGauss(out) :生成的滤波器图像
参数二:Sigma1:空域(像素域)中,高斯分布在滤波器主方向的标准差
参数三:Sigma2:空域(像素域)中,高斯分布在垂直于滤波器主方向的标准差。注:Sigma1和Sigma2确定空间域内高斯函数的平滑量
参数四:Phi:滤波器在空间域的主要方向
参数五:Norm:滤波器的归一化因子。注:如果使用fft_image和fft_image_inv进行过滤,必须设置参数Norm = 'none’和Mode = ‘dc_center’(本文未使用)
参数六:Mode:频率图中心位置。注: 如果使用实值快速傅里叶变换算子rft_generic, 则Mode = ‘rft’ ;如果使用快速傅里叶变换算子fft_generic,则可以使用Mode = 'dc_edge’来提高效率
参数七:Width, Heigh:生成滤波图像的宽、高原理:首先产生一个高斯核,然后根据输入的参数对这个高斯核矩阵做傅里叶变换(实现从空域或时域到频域的转换工具),得到特定模式和特定分辨率的所谓频域的滤波器,例如我要进行rft_generic的变换,那么我的高斯滤波器模式就要写为‘rft’。并通过设置参数保持频域滤波器和原图像一致。

2、程序部分

dev_update_off ()
dev_set_draw ('margin')
dev_set_line_width (2)
read_image ( Image, 'D:/Halocn files/裂纹/surface_scratch')
get_image_size (Image, Width, Height)
* 提取背景
       fft_generic (Image, ImageFFT, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')
       gen_gauss_filter (ImageGauss, 50, 50, 0, 'none', 'dc_center', Width, Height)
       convol_fft (ImageFFT, ImageGauss, ImageConvol)
       fft_generic (ImageConvol, ImageBackground, 'from_freq', 1, 'sqrt', 'dc_center', 'byte')
       * 图像减去背景,增加特征与背景对比度
       sub_image (Image, ImageBackground, ImageSub, 2, 100)
       * 中值滤波,为分水岭域做准备
       mean_image (ImageSub, ImageMedian, 7, 7)
*        median_image (ImageSub, ImageMedian, 'circle', 9, 'mirrored')
       dyn_threshold (ImageSub, ImageMedian, DarkPixels, 5, 'dark')


       connection (DarkPixels, ConnectedRegions)
       select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 200, 1000)

      dev_display (Image)
dev_display (SelectedRegions)

union1 (SelectedRegions, RegionUnion)
dilation_circle (RegionUnion, RegionDilation, 6)

skeleton (RegionDilation, Skeleton)
connection (Skeleton, Errors)

select_shape (Errors, Scratches, 'area', 'and', 50, 10000)
select_shape (Errors, Dots, 'area', 'and', 1, 50)
dev_display (Image)
dev_set_color ('red')
dev_display (Scratches)

----------------------原图-----------------------------------快速傅里叶变换---------------------------高斯滤波-----------
在这里插入图片描述
----------------------背景图--------------------------------差分-----------------------------------------结果-----------------
在这里插入图片描述

案例一—傅里叶变换+bool分析在这里插入图片描述

图像由于线阵相机扫描得到,所以竖直方向会有杂质,通过去除竖直方向的频率,从而达到去除竖直方向的杂波

效果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/0e6bf65987c5410daf1cd4c3fac8a39d.png
-----------------------快速傅里叶变换(频谱图)---------------------------------------------------淹没竖直方向杂波-------------======-----
在这里插入图片描述

-----------------------------原图--------------------------------------------------------------------------------频域变换成空间域---------------------------
在这里插入图片描述
haclon程序如下

* 1.读取图像****************************************
read_image (Image, '4.bmp')
get_image_size (Image, Width, Height)
dev_get_window (WindowHandle)
* 转换为灰度图片
rgb1_to_gray (Image, GrayImage)

* 2.傅里叶变换--竖直方向杂质滤波****************************

*傅里叶变换 图片转到频域
fft_generic (GrayImage, ImageFFT, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')

*淹没竖直方向杂波
gen_rectangle1 (Rectangle1, 993.718, 998.63, 1012.46, 2000)
gen_rectangle1 (Rectangle2, 993.718, 0, 1012.46, 984.983)
union2 (Rectangle1, Rectangle2, RegionUnion)
paint_region (RegionUnion, ImageFFT, ImageFFTFiltered, 0, 'fill')

*傅里叶变换 频域变换成空间域
fft_generic (ImageFFTFiltered, ImageFFT1, 'from_freq', 1, 'sqrt', 'dc_center', 'byte')

dev_open_window (-50, 0, Width/3, Height/3, 'black', WindowHandle1)
dev_display (Image)
dev_open_window (-50, Width/3, Width/3, Height/3, 'black', WindowHandle2)
dev_display (ImageFFT1)
  • 2
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值