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
Image:输入图像
Lines:提取出的亚像素精度线条
Sigma:应用的高斯平滑的系数
Low:后滞阈值分割的低值
High:后滞阈值分割的高值
LightDark:提取图像中的亮色或者暗色线条
ExtractWidth:是否提取线条的宽度
LineModel:提取线条的模式,有'none',
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值。两个例子说明这个问题,对于一个幅度值大于100的5个像素宽的线条,如果Sigma=1.5,那么参数High应该大于14。而对于一个幅度值大于100的10个像素宽的线条来说,如果Sigma=3,那么参数High应该大于3.5。参数Low的值选在0.25High到0.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
最后就是检测直线,后面Segment the scratches by using morphology都是常规步骤了。