Lineslines1lines-flines-f1Ricerice1rice-frice-f1如上所示,第一列为原图,第二列为加过汉明窗的原图,第三列为原图的二维傅里叶变换频域图,第四列为第二列图像的二维傅里叶变换频域图。可以看见在lines-f,也就是lines原图的二维傅里叶频谱图中,存在明显的水平和垂直分量。这里的水平和垂直分量主要是由lines这张图本身的特点导致的。如果将原图做水平方向的分解,就是取出一行的像素,可以得到一个周期性方波。而周期性方波的频谱则是sa函数的周期性采样,值为在奇数项存在的依次递减的数。因此可以在图中看到加强的横线和竖线。Rice这张图与lines这张图有区别,其无论哪个方向的分量都没有什么规律,但是rice-f即他的二维傅里叶变换谱中却也存在水平和垂直的分量。这些分量的形成与MATLAB中的fft2函数的算法有关,这里来根据代码进行深入讲解。代码如下:f=imread('lines.png');f1=f;[m,n]=size(f);m1=hamming(m);n1=hamming(n);fori=1:mforj=1:nf1(i,j)=f(i,j)*m1(i)*n1(j);endendimshow(f1,[])%显示加了窗之后的图像figure;F=fft2(f);%F对原图进行傅立叶变换后的结果Fc=fftshift(F);%将傅立叶变换的中心移至频谱的中心位置S=log(1+abs(Fc));%取傅立叶变换的频谱,即傅里叶谱imshow(S,[]);%显示原图频谱figure;F=fft2(f1);%F对原图进行傅立叶变换后的结果Fc=fftshift(F);%将傅立叶变换的中心移至频谱的中心位置S=log(1+abs(Fc));%取傅立叶变换的频谱,即傅里叶谱imshow(S,[])%显示加了窗函数后的频谱figure;f=imread('rice.tif');f1=f;[m,n]=size(f);m1=hamming(m);n1=hamming(n);fori=1:mforj=1:nf1(i,j)=f(i,j)*m1(i)*n1(j);endendimshow(f1,[])%显示加了窗之后的图像figure;F=fft2(f);%F对原图进行傅立叶变换后的结果Fc=fftshift(F);%将傅立叶变换的中心移至频谱的中心位置S=log(1+abs(Fc));%取傅立叶变换的频谱,即傅里叶谱imshow(S,[])%显示原图频谱figure;F=fft2(f1);%F对原图进行傅立叶变换后的结果Fc=fftshift(F);%将傅立叶变换的中心移至频谱的中心位置S=log(1+abs(Fc));%取傅立叶变换的频谱,即傅里叶谱imshow(S,[])%显示加了窗函数后的频谱如上,由于要解释rice-f中出现的水平与垂直分量,这里就从程序的后半部分开始解释。其前半部分与后半部分的算法完全一致,就不做赘述。首先读入图像,获得其大小。而后生成两个汉明窗,分别加在x和y两个方向上,这样就生成了rice1这样的四周是黑色的图像。之后对原图进行傅里叶二维变换。这里就要说到MATLAB中fft2函数的算法,其在运算的过程中对图像进行了周期延拓,x轴y轴两个方向都进行了无限的循环。由于图像本身左右两个边界像素不同,上下两个边界像素也不同,就产生了高频的水平或垂直分量,也就是形成了rice-f中的效果。Fftshift函数是为了把频谱的原点搬移到图像正中心,便于观察。随后对加了汉明窗的图像也进行了傅里叶变换,可以看见水平和垂直的分量消失了,说明缺少了边界上的变化,就会减少水平和垂直的高频分量。对于lines来说同理,由于lines本身是很有规律的,但是由于他的边界反而没有图片本身有规律,却符合了一些其他的频率,因此就在频域图中生成了其他的水平与垂直分量的线。在把边界拉低后,边界的变化很小,因此就少了很多其他水平与垂直频率的分量,但是本身图片体现出来的频率还保留着。Testtest-ftest1-ftest-i之后来说第二个任务,首先test为原图,test-f为原图的傅里叶变换(没有使用fftshift函数搬运),test1-f为原图像素乘以(-1)^(x+y)后的傅里叶变换(没有使用fftshift函数搬运),而test-i为傅里叶变换后做共轭,再做反变换后再乘以(-1)^(x+y)的结果。代码如下:f=imread('test.jpg');f=im2double(f);[m,n]=size(f);fs=fft2(f);S=log(1+abs(fs));imshow(S,[]);figure;fori=1:mforj=1:nif(mod((i+j),2)==1)f(i,j)=-f(i,j);endendendfs=fft2(f);S=log(1+abs(fs));imshow(S,[]);figure;fori=1:mforj=1:nfs(i,j)=conj(fs(i,j));endendfc=ifft2(fs);fori=1:mforj=1:nfc(i,j)=real(fc(i,j));if(mod((i+j),2)==1)fc(i,j)=-fc(i,j);endendendimshow(fc,[]);由于代码本身很简单,用的也都是之前用过的函数,对于本身程序的解释就不做赘述。仅对原图像素乘以(-1)^(x+y)的操作进行解释fori=1:mforj=1:nif(mod((i+j),2)==1)f(i,j)=-f(i,j);endendend如上,(-1)^(x+y)取值的效果就是如果x+y为偶数取1,如果x+y为基数就取-1,因此这里判断x+y对2取余的结果来进行判断某个像素的值是否应该取反。随后我们来解释这些操作对图像本身起到的作用。首先傅里叶变换具有特性,在时域上与e^j2π(u0x/T)做积,频域上相当于向右平移u0。这一点在空间域上也满足。因此在空间域上乘以(-1)^(x+y),也就是相当于在频域上将图像分别向x,y两个方向平移一半的边长,达到做了fftshift的效果。随后对F(u,v)取共轭,这里根据傅里叶变换的对称性,F*(u,v)=F(-u,-v)。因此相当于将频谱图像做了一个中心对称。而根据傅里叶反变换公式:这里的u取-u,v取-v后,其底数由于是遍历求和,是没有变化的,但是指数上多了一个负号,把负号转移给xy后,就会使得f(x,y)=f(-x,-y)也就是对图像本身进行了中心对称。之后再用之前的方法把图像原本取负数的值恢复回正数,就得到了中心对称的原图。与此同时,由于计算机计算fft与ifft过程中矩阵是从0开始的,在x或y为0时,其某一个轴的值就不会变化。反映到图像中就是第一行和第一列的值会显示图像循环的边界值,而不是本来的f(-x,-y)。