matlab進行圖像傅里葉變換去噪(fft2、fftshift、ifft2、ifftshift)

在數字圖像處理中,去噪是一個經常進行的操作。
除了在空域上進行去噪,比如使用均值濾波、中值濾波等等濾波器外,利用傅里葉變換在頻域上進行操作也是一種非常有效的方式。

使用傅里葉變換進行圖像去噪的原理如下:
我們知道,圖像中的噪聲往往代表着圖像上灰度值的突變,從而對應着高頻部分,而圖像中的其他大部分內容則主要集中在低頻部分。
因此,通過將空間圖像進行傅里葉變換後,轉化到頻域上,我們可以得到這個圖像每個像素的相位和幅度值。
對於相位而言,代表着圖像中的位置形狀信息,一般情況下我們不對其做處理,否則可能就無法恢復出原始圖像的形狀。
而幅度值則主要代表着能量的大小,也就是每一個頻率上的能量大小。我們只要將高頻部分的能量值置爲0,就可以去除噪聲。
需要注意的是,在進行傅里葉變換(fft2)後,低頻部分集中分佈在四個角落,通過移位(fftshift)之後,將其集中到圖像的中心,這只是爲了便於處理。
當我們對幅值進行處理後,再進行反移位(ifftshift)恢復到原始的分佈情況,之後結合相位計算出每個像素對應的值。
對其進行傅里葉反變換(ifft)後,就可以恢復出時域圖像,此時圖像上的噪聲就可以去除了。

一個具體例子如下所示:
代碼:

clear;
clc;
F = imread('C:\Users\asus1\Desktop\IMG_20170708_090611.jpg');
F1 = rgb2gray(F);
F1 = imnoise(F1,'gaussian',0.1);   %添加噪聲
subplot(2,2,1),imshow(F1);
title('噪聲圖像');

FFT = fft2(F1);
myangle = angle(FFT);             %相位譜(沒有進行移位的)
FS = abs(fftshift(FFT));          % 移位,使低頻成分集中到圖像中心,並得到幅度譜

S = log(1+abs(FS));
subplot(2,2,2),imshow(S,[]);     % 帶噪聲的幅度圖,亮度代表着能量
title('傅里葉變換後幅度圖');

% 對幅度圖進行操作,去除外圍的高頻成分的幅度值,也就是將高頻成分能量去除了
%(此處只是簡單地保留了圖像中心 200 X 200 的圖像塊)
[m,n] = size(FS);
FS(1:m/2-100,:) = 0;
FS(m/2+100:m,:) = 0;
FS(m/2-100:m/2+100,1:n/2-100) = 0;
FS(m/2-100:m/2+100,n/2+100:n) = 0;

SS = log(1+abs(FS));
subplot(2,2,3),imshow(SS,[]);     % 去除外圍幅度值後的幅度圖,亮度代表着能量
title('去除外圍幅值後幅度圖');


aaa = ifftshift(FS);          % 將處理後的幅度圖反移位,恢復到正常狀態
bbb = aaa.*cos(myangle) + aaa.*sin(myangle).*1i;      % 幅度值和相位值重新進行結合,得到複數
fr = abs(ifft2(bbb));               % 進行傅里葉反變換,得到處理後的時域圖像
ret = im2uint8(mat2gray(fr));       
subplot(2,2,4),imshow(ret);       %去除高頻成分後的圖像
在這裏插入代碼片

運行結果如圖所示:
在這裏插入圖片的描述
可以發現,在進行頻域的濾波之後,圖像的噪聲明顯減少了,因爲我們只保留了低頻成分的幅值,如圖三所示,中心的那一小塊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章