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