上一篇介绍完频域的基础,其实频率特征就是图像的灰度变化特征,低频特征是灰度变化不明显,例如图像整体轮廓,高频特征是图像灰度变化剧烈,如图像边缘和噪声。一个重要的经验结论:低频代表图像整体轮廓,高频代表了图像噪声,中频代表图像边缘、纹理等细节。下面我就用几个案例来演示下如何通过频域去对图片进行预处理,然后提取出我们想要的特征。
那么什么时候使用傅里叶变换进行频域分析呢?
1.具有一定纹理特征的图像,纹理可以理解为条纹,如布匹、木板、纸张等材质容易出现。
2.需要提取对比度低或者信噪比低的特征。
3.图像尺寸较大或者需要与大尺寸滤波器进行计算,此时转换至频域计算,具有速度优势。因为空间域滤波为卷积过程(加权求和),频域计算直接相乘。
在halcon中,在频域中进行检测,有两个步骤是比较关键的:
1.一个是生成合适的滤波器;
2.一个是空间域和频域之间的转换。
生成滤波器主要有如下算子:
gen_std_bandpass,
gen_sin_bandpass,
gen_gauss_filter,
gen_mean_filter,
gen_derivative_filter,
gen_bandpass,
gen_bandfilter,
gen_highpass,
gen_lowpass;
空间域和频域之间的转换,主要有如下两个关键算子:
rft_generic
fft_generic
这两个算子的共同点:
1.这两个算子都是进行快速傅里叶变换的算子
2.这两个算子都可以进行空间域-》频域和频域-》空间域的变换,只需要针对参数Direction分别进行选择,‘to_freq’是进行的是空间域-》频域的变换,‘from_freq’是频域-》空间域的变换。
3.针对参数ResultType,如果是’to_freq’,那么ResultType一般选择’complex’;如果是’from_freq’,ResultType一般选择’byte’(灰度图像)。
这两个算子的不同点:
1.rft_generic算子的输入图像是实值函数,fft_generic的输入图像是复数函数;从输出的结果来看,rft_generic只需要计算和存储了左半边的复数图像信息就可以了,因为右半边是共轭对称的。因此从最终的输出我们可以看到,只有左上和左下有DC成分。而fft_generic如果设定的是原点在左上角,那么就会在四个角上有DC成分。
2.fft_generic算子可以通过参数Mode设置原点的位置:如果设置的是’dc_edge’,那么原点在左上角;如果设置的是’dc_center’,那么就会将原点平移到中心位置。fft_generic算子一般会设置为’dc_center’。对于rft_generic算子,因为没有设置项,所以默认原点位置为左上角。
下面我们用一个案例来演示下:
原图如下:
代码如下:
read_image (Image7, 'D:/博客项目源码/频域内容(包含基础)/频域图形解析/7.png')
*转成灰度图
rgb1_to_gray (Image7, GrayImage)
*傅里叶变换
fft_image (GrayImage, ImageFFT4)
*生成一个矩形区域
gen_rectangle1 (ROI_0, 8.28752, 3.48559, 156.42, 152.66)
gen_rectangle1 (TMP_Region, 7.65984, 164.617, 154.537, 313.223)
*合并两个区域
union2 (ROI_0, TMP_Region, ROI_0)
gen_rectangle1 (TMP_Region, 167.091, 2.91622, 320.245, 152.091)
union2 (ROI_0, TMP_Region, ROI_0)
gen_rectangle1 (TMP_Region, 168.974, 169.172, 318.989, 314.931)
union2 (ROI_0, TMP_Region, ROI_0)
*将四个矩形区域灰度值喷涂为0
paint_region (ROI_0, ImageFFT4, ImageResult, 0, 'fill')
*由频域图转成空间图
fft_image_inv (ImageResult, ImageFFTInv)
处理得到的图像:
原图如下:
代码如下:
read_image (Image10, 'D:/博客项目源码/频域内容(包含基础)/频域图形解析/10.png')
*转换成灰度图片
rgb1_to_gray (Image10, GrayImage1)
*获取图像尺寸
get_image_size (GrayImage1, Width1, Height1)
*傅里叶变换
fft_generic (GrayImage1, ImageFFT5, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')
*生成理想的高通滤波器图像
gen_highpass (ImageHighpass, 0.2, 'none', 'dc_center', Width1, Height1)
*用滤波器对图像在频域上做卷积
convol_fft (ImageFFT5, ImageHighpass, ImageConvol)
*fft_image_inv (ImageConvol, ImageFFTInv1)
*转回空间域图像
fft_generic (ImageConvol, ImageFFT6, 'from_freq', 1, 'sqrt', 'dc_center', 'byte')
效果图: