Matlab實現基於頻域對一維信號利用傅里葉低通濾波平滑


基於頻域的低通濾波(一維信號——灰度圖的灰度級頻數分布曲線)

算法分析

  1. 求灰度圖的的灰度級頻數。繪制出頻數分布曲線(一維信號)
  2. 將一維信號從空域轉到頻域。對步驟1中的灰度級頻數分布曲線進行傅里葉變換
  3. 過濾高頻信號。在頻域中將高頻信號置0,只保留低頻信號(通過fft函數傅里葉變換之后,高頻點分布在頻譜中間,低頻信號分布在頻譜兩端)
  4. 利用傅里葉反變換將頻域反變換回空域,經過傅里葉平滑后的頻數分布曲線變得更光滑連續

偽代碼

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個低頻信號得到的結果

  • 實驗結果證明,保留更多的低頻信號,經過傅里葉平滑后得到結果與原圖灰度級頻數分布越接近


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM