1. 程式人生 > >matlab數字影象的傅立葉變換實驗

matlab數字影象的傅立葉變換實驗

 影象的傅立葉變換


1.啟動MATLAB程式,讀入一幅影象;對影象做FFT。使用’subplot’命令,同時顯示原始影象其頻譜圖;
1.1實驗過程:
首先讀取一幅影象,然後將這幅影象歸一化到0~1之間,然後對影象做二維離散傅立葉變換,然後做快速傅立葉變換,即直流分量移到頻譜中心,讓正半軸部分和負半軸部分的影象分別關於各自的中心對稱,然後取傅立葉變換的實部,然後做頻譜對數變換,就得到原影象的頻譜圖,最後將原影象和對應的頻譜圖顯示出來。
1.2程式碼及影象






I=imread('f:\lena.jpg');%讀入影象
F=fft2(im2double(I));%FFT
F=fftshift(F);%FFT頻譜平移
F=real(F);

T=log(F+1);%頻譜對數變換
subplot(1,2,1),imshow(I),title('原始影象');
subplot(1,2,2),imshow(T,[]),title('原始影象其頻譜圖');























2. 讀入一幅影象,分別為影象新增椒鹽、高斯噪聲,做FFT變換。使用’subplot’命令,將原始影象、原始影象頻譜圖、新增噪聲後的影象,以及噪聲影象的頻譜圖同時顯示出來。
2.1實驗過程
得到原始影象的頻譜圖的方法同上,然後對原影象模擬疊加密度為0.04的椒鹽噪聲,然後新增模擬均值為0方差為0.02的高斯噪聲,然後得到噪聲影象的頻譜圖,方法同上,最後顯示所有影象。
2.2程式碼及影象
I=imread('f:\lena.jpg');
%讀入影象
F=fft2(im2double(I));%FFT
F=fftshift(F);%FFT頻譜平移
F=real(F);
T=log(F+1);%頻譜對數變換
subplot(3,2,1),imshow(I),title('原始影象');
subplot(3,2,2),imshow(T,[]),title('原始影象其頻譜圖');
S=imnoise(I,'salt & pepper', 0.04); %模擬疊加密度為0.04的椒鹽噪聲
K=fft2(im2double(S));%FFT
K=fftshift(K);%FFT頻譜平移
K=real(K);
T=log(K+1);%頻譜對數變換
subplot(3,2,3),imshow(S),title('新增椒鹽噪聲後的影象');

subplot(3,2,4),imshow(T,[]),title('椒鹽噪聲頻譜圖');
G=imnoise(I,'gaussian',0,0.02);%模擬均值為0方差為0.02的高斯噪聲,
H=fft2(im2double(G));%FFT
H=fftshift(H);%FFT頻譜平移
H=real(H);
T=log(H+1);%頻譜對數變換
subplot(3,2,5),imshow(G),title('新增高斯噪聲後的影象');
subplot(3,2,6),imshow(T,[]),title('高斯噪聲頻譜圖');











3. 讀入一幅影象,對影象分別進行高斯低通、巴特沃茲低通、高斯高通和巴特沃茲高通頻域濾波,比較其銳化和平滑效果;
3.1實驗過程
對於高斯低通頻域濾波,首先求原影象的頻譜圖,然後根據二維高斯低通濾波器(GLPF)定義,對頻譜圖做高斯低通濾波,使低頻通過而使高頻衰減,最後做快速傅立葉逆變換,結果發現濾波後的影象變模糊,比原始影象減少尖銳的細節部分而突出平滑過渡部分;對於巴特沃茲低通頻域濾波,然後根據二級巴特沃思低通濾波器(BLPF)定義,對頻譜圖做巴特沃茲低通濾波,使低頻通過而使高頻衰減,最後做快速傅立葉逆變換,結果發現濾波後的影象變模糊,比原始影象減少尖銳的細節部分而突出平滑過渡部分;經對比影象後發現,經過巴特沃思低通濾波的影象比經過高斯低通頻域濾波的影象更平滑。
對於高斯高通頻域濾波,首先求原影象的頻譜圖,然後根據截頻距原點為D0的高斯高通濾波器(GHPF)定義,對頻譜圖做高斯高通濾波,使高頻通過而使低頻衰減,最後做快速傅立葉逆變換,結果發現濾波後的影象變銳化,比原始影象減少平滑過渡而突出邊緣等細節部分;對於巴特沃茲高通頻域濾波,然後根據二階且截至頻率距原點的距離為D0的巴特沃思高通濾波器(BHPF)定義,對頻譜圖做巴特沃茲高通濾波,使高頻通過而使低頻衰減,最後做快速傅立葉逆變換,結果發現濾波後的影象變銳化,比原始影象減少平滑過渡而突出邊緣等細節部分;經對比影象後發現,經過高斯低通濾波的影象比經過高斯低通巴特沃思低通頻域濾波的影象更平滑。


3.2程式碼及影象


%高斯低通頻域濾波
I=imread('f:\lena.jpg');
subplot(1,2,1),imshow(I),title('原始影象');
I=double(I);
S=fftshift(fft2(I));
[M,N]=size(S);                    
n=2;                                  
d0=30; %GLPF濾波,d0=5,15,30(程式中以d0=30為例)                    
n1=floor(M/2);                          
n2=floor(N/2);                           
for i=1:M 
    for j=1:N
        d=sqrt((i-n1)^2+(j-n2)^2);         
               h=1*exp(-1/2*(d^2/d0^2));  
        S(i,j)=h*S(i,j);                   
    end
end
S=ifftshift(S);                           
S=uint8(real(ifft2(S)));                                     
subplot(1,2,2),imshow(S),title('高斯低通濾波影象');




%巴特沃斯低通頻域濾波
I=imread('f:\lena.jpg');
subplot(1,2,1),imshow(I),title('原始影象');
F=double(I);                % 資料型別轉換,MATLAB不支援影象的無符號整型的計算
G=fft2(F);                    % 傅立葉變換
G=fftshift(G);                 % 轉換資料矩陣
[M,N]=size(G);
nn=2;                       % 二階巴特沃斯(Butterworth)低通濾波器
d0=30;                      %截止頻率為30
m=fix(M/2); n=fix(N/2);
for i=1:M
       for j=1:N
           d=sqrt((i-m)^2+(j-n)^2);
           h=1/(1+0.414*(d/d0)^(2*nn));         % 計算低通濾波器傳遞函式
           result(i,j)=h*G(i,j);
       end
end
result=ifftshift(result);
Y2=ifft2(result);
Y3=uint8(real(Y2));
subplot(1,2,2),imshow(Y3),title('巴特沃斯低通濾波')




%巴特沃斯高通頻域濾波
I=imread('f:\test.jpg');
subplot(121),imshow(I); title('原始影象'); 
F=double(I);% 資料型別轉換,MATLAB不支援影象的無符號整型的計算 
G=fft2(F);% 傅立葉變換 
G=fftshift(G);%轉換資料矩陣 
[M,N]=size(G);
nn=2;% 二階巴特沃斯(Butterworth)高通濾波器 
d0=30;
m=fix(M/2);n=fix(N/2);
for  i=1:M
     for j=1:N
          d=sqrt((i-m)^2+(j-n)^2);            
                   if (d==0)               
                       h=0; 
           else 
             h=1/(1+0.414*(d0/d)^(2*nn));% 計算傳遞函式            
                   end 
                   result(i,j)=h*G(i,j);
        end 
end 
result=ifftshift(result);
J2=ifft2(result); 
J3=uint8(real(J2)); 
subplot(122),imshow(J3); title('巴特沃斯高通濾波後圖像'); % 濾波後圖像顯示