实现图像的二维傅里叶变换的频谱图
图像的频谱分析有助于我们理解图像的二维傅里叶变换(离散非周期),并且以直观的方式来展现图像的低通或高通滤波,然而如何获得图像的频谱呢?在matlab中只要短短的几行代码,就可以利用库中的函数轻松地做到。
可是,在此过程中都发生了哪些数学变换,以及得到的频谱图的含义,以及二维傅里叶变换的执行过程…都被蒙在了暗盒里。此篇文章将以应用的角度来加深对二维傅里叶变换执行过程的理解。不过,谈不上实际应用,因为普通的二维傅里叶变换实在是…太!慢!了!
由于我只熟悉java,所以用java来写。如果你熟悉的语言不是java并不会影响你对本文的理解,我会一步步解释,保证你用C/C++也能实现它。
1. 图像矩阵f(x,y)装入二维数组
这个简单,在双重循环里获取图像(i,j)坐标处的像素值(这里为了减少运算量,只获取了一个颜色通道),存到二维数组中待下一步操作
for (int i = 0;i<width;i++) {
for(int j=0;j<height;j++){
pixel[i][j]=image.getRGB(i,j)<<24>>24&0xff;
}
}
2.编写二维傅里叶变换类
F ( k , l ) = ∑ x = 0 w i d t h − 1 ∑ y = 0 h e i g h t − 1 f ( x , y ) e − i 2 π ( k x w i d t h + l y h e i g h t ) F(k,l)=\sum_{x=0}^{width-1}\sum_{y=0}^{height-1} f(x,y) e^{-i2\pi(\frac{kx}{width}+\frac{ly}{height})} F(k,l)=x=0∑width−1y=0∑height−1f(x,y)e−i2π(widthkx+heightly)
由欧拉公式:
e − i x = c o s ( x ) − i s i n ( x ) e^{-ix}=cos(x)-isin(x) e−ix=cos(x)−isin(x)
得:
F ( k , l ) = ∑ x = 0