针对这一类表面的检测就不能单纯依靠帧差或者背景差来完成,因为背景的纹理不可能和当前图像的纹理完全相同。
方法一—局部阈值分割
一、局部阈值分割
1、gen_sin_bandpass–局部阈值分割
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—计算图像的实值快速傅里叶变换
一般需要使用两次,因为在频域处理完之后,还需要转换成空间域。
参数一: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)
----------------------原图-----------------------------------快速傅里叶变换---------------------------高斯滤波-----------
----------------------背景图--------------------------------差分-----------------------------------------结果-----------------