废话不多说先上代码。
clear
clc
img=imread('f2.jpg');
subplot(2,2,1);imshow(img);title('原图');
f=rgb2gray(img);
F=fft2(f);
F1=log(abs(F)+1);
subplot(2,2,2);imshow(F1,[]);title('幅度谱');
Fs=fftshift(F);
S=log(abs(Fs)+1);
subplot(2,2,3);imshow(S,[]);title('平移后的幅度谱');
fr=real(ifft2(ifftshift(Fs)));
ret=im2uint8(mat2gray(fr));
subplot(2,2,4);imshow(ret);title('逆变换');
我们今天所要认识的就是以上这个简单的代码段,简单来说就是用matlab来将图像变换成频域的幅度谱,那么到底是怎么实现的。
我们可以看到一开始是用img=imread()这个函数读入了一个图像并以img变量存储,最重要的是这个图象存储的路径一定是和代码的路径是一致的,否则就会识别不出。
读出后紧接着就用subplot和imshow联合建立了一张坐标域并显示了原图。
之后,f=rgb2gray()这个函数明显是用来将彩图转换为灰图,因为彩图的数值比起灰度图非常不方便。
我们都知道彩图是由红绿蓝三种色组成的,rgb2gray中的rgb就代表red,green和blue,而每一种颜色都从0-255里面的一个数字组成,0代表纯白,255代表纯黑,介于二者之间就是红绿蓝。也就是说图像里的数值越靠近0,颜色越鲜艳,越靠近255则越暗淡。
懂了这一点我们继续往下想。
彩图需要一个三维坐标来表示颜色既(r,g,b),只有这样才能表示出丰富且多彩的图像,而这个组合的范围显然不是0-255,而是0-255^3,也就是0-16581375,如此庞大的数据会让计算机在运算时负担很大,更别说频谱怎么计算三维的也很麻烦。
与之相比灰度图就简单得多,0-255即可完全表示一副图像,并且由于是一维数据计算频谱自然很容易,从而我们选择了转换灰图。
接下来两句F=fft2()和F1=log(abs(F)+1)则是将灰图转换为频谱,或者说幅度谱。
第一句是进行傅里叶fft变换,这个原理自然不用讲。
后面一句则是为了将得到的频谱换为幅度谱,首先幅度谱全为正值所以要加1,再者图像的显示是以数值显示,那么必然计算出来的数据会造成溢出,这也是为了防止显示不出。这一点在接下来用imshow()显示幅度谱时有所验证。
我们可以分别显示F和F1,其中F只有黑白二色,限制范围后更是纯黑一片,显然得不到幅度谱,故用这个函数式进行处理后在显示。
但是以上得到的幅度谱我们会发现其幅度谱的中心是位于四角,而非最中央,这时候我们完全可以选择当作没看到,毕竟幅度谱已经求出来了还管那么多干啥,不过作为一个学习者自然不可以这样想的。
解决办法非常简单,用Fs=fftshift(),进行频域变换即可,我们就可以求得频谱中心在图中央的幅度谱了,后面的式子同上,下面就不多说了。
最后一个式子进行逆变换,这里用不用real并没有什么区别,这就属于额外的内容了,大家感兴趣可以自己去查一下,这里就不过多赘述了。
我们接下来主要看看最后可能出现的问题,如果你选的图像太大那么你就会出现和我一样的警告,表明图像太大以%33显示,这个问题比较轻微,并不会影响代码的执行。
最后我们来看一看执行后的结果。
还是比较符合的,好了幅度谱就到此了。
根据频谱我们接下来将会进行简单的图像处理,大家可以多关注哦。