Halcon算子rft_generic()参数解析及应用

1.功能

rft_generic:计算图像的实值快速傅里叶变换。

区别:fft_generic是计算输入图像的快速傅里叶变换。

fft_generic(Image : ImageFFT : Direction, Exponent, Norm, Mode, ResultType : )

Exponent:对应公式中指数符号,前向变换用-1,后向变换用1。

Mode:‘dc_center’频域图中心频率为0,‘dc_edge’频域图边角点频率为0。

2.参数

rft_generic(Image : ImageFFT : Direction, Norm, ResultType, Width : )

Image:输入图像。

ImageFFT:傅里叶转换后的图像。

Direction:计算正向或反向变换。

默认值:'to_freq'(从空间域到频域),也可设置为'from_freq'(频域到空间域)。

Norm:变换的归一化因子。

默认值:'sqrt'(开根号,c=sqrt(M*N),变亮);也可设置为 'n'(图像宽*图像高,c=M*N,变暗),

'none'(不使用,c=1)。

ResultType:输出图像的图像类型。

默认值:'complex'(复数图像),也可设置为'byte'(灰度图像), 'cyclic', 'direction', 'int1', 'int2', 'int4', 'real'(实值图像), 'uint2'。

Width:运行时应针对其进行优化的图像宽度。

默认值:512,也可设置为128, 160, 192, 256, 320, 384, 640, 768, 1024, 2048。

3.描述

rft_generic计算输入图像的快速傅里叶变换。一般需要使用两次,因为在频域处理完之后,还需要转换成空间域。

与fft_generic, fft_image和fft_image_inv相比,前向变换中的输入图像是实值图像(即,不是复数图像)。在这种情况下,复数输出图像具有冗余。图像右半部分的值是图像左半部分对应值的复共轭。因此,只计算和存储复数图像的左半部分可以节省运行时间和内存。

ResultType参数可用于指定反向变换的结果图像类型(Direction = 'from_freq')。

在正向变换(Direction = 'to_freq')中,即从空间域到频域,生成频域图时,ResultType必须设置为'complex'(输出图像为复数类型)。

参数方向决定了是对频域进行变换还是返回到空间域。

对于Direction = 'to_freq',输入图像必须具有实值类型,即,复数图像不能用作输入。支持所有可以转换为real类型图像的图像类型。在这种情况下,输出是一个尺寸为(w/2+1)*h的复数图像,其中w和h是输入图像的宽度和高度。在这种模式下,指数-1在转换中使用(参见fft_generic)。

对于Direction = 'from_freq',输入图像必须是复数类型的。在这种情况下,输入图像的大小不足以确定输出图像的大小。这必须通过将Width设置为一个有效值来完成,即2*w-2或2*w-1,其中w是复数图像的宽度。在这种模式下,在转换中使用指数1。

规范化因子可以用Norm设置,并且可以采用值'none', 'sqrt'和'n'。用户必须确保参数的使用一致。这意味着用于前向和后向变换的归一化因子在相乘时必须产生w*h。

4.注意

变换总是对整个图像执行,也就是说,图像的域被忽略。

5.应用(以下为搬运,博客:http://t.csdn.cn/Xu6sl

频率特征是图像的灰度变化特征,低频特征是灰度变化不明显,例如图像整体轮廓,高频特征是图像灰度变化剧烈,如图像边缘和噪声。

低频代表图像整体轮廓,高频代表了图像噪声,中频代表图像边缘、纹理等细节。

1、具有一定纹理特征的图像,纹理可以理解为条纹,如布匹、木板、纸张等材质容易出现。
2、需要提取对比度低或者信噪比低的特征。
3、图像尺寸较大或者需要与大尺寸滤波器进行计算,此时转换至频域计算,具有速度优势。因为空间域滤波为卷积过程(加权求和),频域计算直接相乘。

在halcon中,使用频域进行检测,有两个步骤是比较关键的:

(1)生成合适的滤波器;(2)空间域和频域之间的转换。

采用高通滤波法让高频分量顺利通过,使图像的边缘或细条等细节变得清楚,实现图像的锐化。高通滤波可用空频法或频域法来实现。在空间域是用卷积方法,与空域低通滤波的邻域平均法类似。

gen_gauss_filter()在频域生成高斯滤波器。首先产生一个高斯核,然后根据输入的参数对这个高斯核矩阵做傅里叶变换实现从空域或时域到频域的转换),得到特定模式和特定分辨率的所谓频域的滤波器。例如,接下来需要进行rft_generic的变换,高斯滤波器模式"Mode"就要写为‘rft’。并通过设置参数保持频域滤波器和原图像一致。

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:生成滤波图像的宽、高。

gen_gauss_filter得到的频域滤波器,仅从物理意义上看,是一个图像。与时域空间卷积核的物理意义是相同的。rft_generic()对这幅频域图进行卷积(卷积过程与时域无差别),卷积之后图像就产生了变化。比如外环得到减弱,内环得到保留(高低通滤波器的效果),或者在某个方向上得到保留(gabor滤波器的效果),再还原到时域,发现跟原图变化很大。

convol_fft(ImageFFT, ImageFilter : ImageConvol : : )

在频域用滤波器对图像进行卷积。将复合图像ImageFFT的像素乘以滤波图像滤波器的对应像素。

示例代码:

read_image (Image, 'D:/APP/Imgs_project/dogsa.jpg')
get_image_size (Image, Width, Height)
*在频域中生成高斯滤波器
gen_gauss_filter (ImageGauss, 100, 100, 0, 'n', 'rft', Width, Height)
*对图像进行傅里叶变换
rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)
*对傅里叶图像做卷积,使用之前创建的高斯滤波器作为卷积核
convol_fft (ImageFFT, ImageGauss, ImageConvol)
*将卷积后的傅里叶图像还原为空间域图像。可见图像的突变部分得到了增强
rft_generic (ImageConvol, ImageFFT1, 'from_freq', 'none', 'byte', Width)
sub_image (Image, ImageFFT1, ImageSub, 5, 100)
*对图像进行缩放,一般图像特别大的时候,缩放一下,提取效果会更好
zoom_image_factor (ImageSub, ImageZoomed, 0.4, 0.4, 'constant')
*将图像中的有灰度差异的线条提取出来
lines_gauss (ImageZoomed, Lines1, 0.2, 3, 8, 'light', 'true', 'gaussian', 'true')


当图像质量不理想时,提取线条的效果不好时,可以试试上述这种方法。

参考博客(1):http://t.csdn.cn/cEyFe

参考博客(2):http://t.csdn.cn/ZPDOH

你可能感兴趣的:(计算机视觉,图像处理,视觉检测)