基於頻域的低通濾波(一維信號——灰度圖的灰度級頻數分布曲線)
算法分析
- 求灰度圖的的灰度級頻數。繪制出頻數分布曲線(一維信號)
- 將一維信號從空域轉到頻域。對步驟1中的灰度級頻數分布曲線進行傅里葉變換
- 過濾高頻信號。在頻域中將高頻信號置0,只保留低頻信號(通過fft函數傅里葉變換之后,高頻點分布在頻譜中間,低頻信號分布在頻譜兩端)
- 利用傅里葉反變換將頻域反變換回空域,經過傅里葉平滑后的頻數分布曲線變得更光滑連續
偽代碼
A = 讀入灰度圖像
[H,W] = 圖像A的大小
cnt = 存放圖像A的灰度級頻數
統計每個像素值出現次數
繪制A的頻數分布
AF = 進行傅里葉變換(調用fft函數),得到此一維信號在頻域中的頻譜
AF(11:256-9) = 在頻域中將除前10個和后10個低頻信號的高頻信號置0
AI = 進行傅里葉反變換(調用ifft函數),將經過低通濾波的一維信號反變換回空域
%繪制經過傅里葉平滑后的A的頻數分布曲線,加上紅色以示區分
BF = 傅里葉變換,得到頻域中的頻譜
BF(31:256-29) = 在頻域中將一維信號中間高頻信號置為0,兩端各保留30個低頻信號
BI = 將低通濾波之后的信號傅里葉反變換,從頻域轉到空域
%繪制傅里葉平滑后的頻數分布曲線,加上綠色與上一步驟的平滑曲線對比
代碼
A = imread('cameraman.tif');
[a b] = imhist(A); %a是圖像A的灰度級頻數,b是對應的灰度級
figure,plot(a); %繪制A的頻數分布
AF = fft(a); %傅里葉變換(空域轉頻域)
AF(11:256-9) = 0; %在頻域中去掉除前10個和后10個低頻信號的高頻頻數直方圖信號
AI = ifft(AF); %傅里葉反變換(頻域轉空域)
hold on;plot(AI,'r'); %繪制經過傅里葉變換后的A的頻數直方圖
BF = fft(a); %
BF(31:256-29) = 0; %保留前30個和后30個低頻信號
BI = ifft(BF);
hold on;plot(BI,'g'); %與上一個變換后直方圖對比
實驗結果
-
紅色曲線是保留前后各保留10個低頻信號得到的結果,綠色曲線是前后各保留20個低頻信號得到的結果
-
實驗結果證明,保留更多的低頻信號,經過傅里葉平滑后得到結果與原圖灰度級頻數分布越接近