find_scratches_bandpass_fft.hdev相关例程学习

来源:互联网 发布:java jlabel 鼠标事件 编辑:程序博客网 时间:2024/04/30 03:25

Index:.../Filters/FFT/find_scratches_bandpass_fft.hdev


我看文档说,如何检测不均匀光照的表面缺陷呢,先创建一个合适的带通滤波器,然后把图像傅里叶变换在频域滤波,

加强高频部分,然后变回时域做形态学处理。但我想这个应用面应该不宽,只适用例程所提供的这种特性的图片,高频突出的图片。


gen_sin_bandpass (ImageBandpass, 0.4, 'none', 'rft', Width, Height)
rft_generic (ImageInverted, ImageFFT, 'to_freq', 'none', 'complex', Width)
convol_fft (ImageFFT, ImageBandpass, ImageConvol)
rft_generic (ImageConvol, Lines, 'from_freq', 'n', 'byte', Width)

参数选取还是难点,估计得有空看看数字信号处理的书,上面有各种滤波器说明。


invert_image (Image, ImageInverted)

有趣的是,前面写了这个,后面做变换时都用转换后的图像,估计人们也是尝试发现Invert一下的图像更适合rft变换?


lines_gauss (ImageReduced, LinesXLD, 0.8, 3, 5, 'dark', 'false', 'bar-shaped', 'false')

lines_gauss(Image Lines Sigma, Low, High, LightDark, ExtractWidth, LineModel, CompleteJunctions 

Image:输入图像

Lines:提取出的亚像素精度线条

Sigma:应用的高斯平滑的系数

Low:后滞阈值分割的低值

High:后滞阈值分割的高值

LightDark:提取图像中的亮色或者暗色线条

ExtractWidth:是否提取线条的宽度

LineModel:提取线条的模式,有'none', 'bar-shaped', 'parabolic', 'gaussian' 四种

CompleteJunctions:是否添加能够提取的接合点(junction)

 

LineModel被设置为除'none'以外的其他值时,lines_gauss算子会补偿非对称线条(即在线条的中心两侧有不同对比度的线条),来校正提取出的线条的位置和宽度。对大多数应用来说,LineModel'bar-shaped'参数是正确的选择,'parabolic'参数常用来提取边缘比较锐利的线条(比如背光照明的图像中的线条),'gaussian'则在线条边缘不那么锐利的时候使用。参数LineModel仅在参数ExtractWidth被设置为'true'时才有意义。

 

 

因为几何算法的原因,线条提取器(即lines_gauss算子)不可能提取出所有确定的接合点,当CompleteJunctions被设置为'true'时,算子会试图通过不同的算法提取出那些能够提取出来的接合点。

 This is done by immediately accepting line points that have a second derivative larger thanHigh. Points that have a second derivative smaller thanLow are rejected. 


思路如图,也就说选取sigma和low high是还要看看处理图片的灰度大概情况。

 

在选在参数High和参数Low时,应该注意,二阶偏导数受线条幅度和宽度影响的同时,也受参数Sigma的影响。二阶偏导数对线条幅度呈近似线性响应(即幅度值越大,二阶偏导数越大)。而对线条宽度的响应却差不多呈反指数关系(即线条的宽度越宽,二阶偏导数越小),这跟对参数Sigma值的大小响应差不多(即Sigma值越大,得到的二阶偏导数越小)。这就意味着对于一个大的Sigma值,应该选择一个比较小的High值和Low值。两个例子说明这个问题,对于一个幅度值大于1005个像素宽的线条,如果Sigma=1.5,那么参数High应该大于14。而对于一个幅度值大于10010个像素宽的线条来说,如果Sigma=3,那么参数High应该大于3.5参数Low的值选在0.25High0.5High之间比较合适。

 

在提取线条的同时,lines_guass算子还提取线条上每个点的以下属性:

如果ExtractWidth='false'

(1)'angle':垂直于线条的方向的角度

(2)'response':二阶偏导数的幅度值

如果ExtractWidth='true',下面的属性也会被提取出来

(3)'width_left':线条左侧的宽度

(4)'width_right':线条右侧的宽度

如果LineModel没有被设置为'none',那么下面的属性也会被提取出来

(5)'asymmetry':线条的不对称度

(6)'contrast':线条的对比度

上面这些参数能够通过get_contour_attrib_xld算子得到。获得一些参数的函数。

 

注意:

一般来说,特别是在需要提取线条宽度的时候,参数Sigma的选择应该满足Sigma >= w/sqrt(3)w代表图像中线条的宽度(线条直径的一半)),最小允许值是Sigma >= w/2.5。例如,对于一个宽度为4个像素(直径为8个像素)的线条来说,Sigma >= 2.3是合适的参数。



最后就是检测直线,后面Segment the scratches by using morphology都是常规步骤了。


0 0