2015-11-11 383 views
0

我試圖編寫一個MATLAB函數,它接受一個圖像和一個頻率,對該圖像執行一個低通濾波器(只保留低於所提供頻率的頻率),並返回新圖像。MATLAB中圖像的低通濾波器?

我該如何去做這件事?現在我有以下幾點:

function newImage = lowPass(image, freq) 
% apply a low pass filter on an image and output the result 

Fs = 44100; 
eps = 0.000000001; 
transformed = fft2(image); 

for i = ceil(freq * size(image,1)/Fs):size(image,1) 
    for j = ceil(freq * size(image,2)/Fs):size(image,2) 
     transformed(i,j) = 0; 
    end 
end 

newImage = abs(ifft2(transformed))/256; 
newImage = newImage/(max(max(max(newImage))) + eps); 

end 

但是,我的輸出圖像顯示爲藍色,沒有任何意義。現在我的代碼的最後兩行(涉及修改newImage的代碼行)已完成,可將顏色縮放到正確的值。

我在做什麼錯?另外,我很驚訝MATLAB似乎沒有自動完成這個功能。

+0

請你張貼一張樣品圖片。 – kkuilla

+0

相關:[使用高斯低通濾波器的圖像模糊](http://stackoverflow.com/q/27985769/2545927) – kkuilla

+0

@kkuilla不完全相同。這篇文章是在空間領域做的,但是朝着正確的方向邁出了一大步。 – rayryeng

回答

3

當您僅將一個象限置零時,您不會保留2D fft的對稱性。 DC的索引號爲1,Nyquist的索引號爲size(image)/2+1,因此您需要對奈奎斯特進行免費更改。

%generate signal 
A=rand(8,8) 
[m,n]=size(A) 

% FFT 
A_fft = fft2(A) 
%zero out a symmetric region of frequencies 
A_fft((m/2+1) + (-2:2) , :) = 0 
A_fft(: , (n/2+1) + (-2:2)) = 0 

% inverse FFT 
A_mod = ifft2(A_fft) 

%observe that DC is preserved, signal is still real 
mean(A(:)) 
mean(A_mod(:)) 
+1

這就是我要建議的。爲了使事情變得更容易,我正在使用'fftshift'來改變頻率,使DC處於中間位置。它使調零更容易。無論哪種方式,+1。 – rayryeng

+0

你能解釋你的方法是低通濾波器嗎?你可以寫一個函數來獲取一個圖像和一個頻率,並輸出一個圖像,並刪除所有的高頻成分? – Rainmaker

+0

這是一個低通濾波器的例子,它將圖像A的最高頻率(分別爲m/2 + 1和n/2 + 1處的垂直和水平奈奎斯特)分解爲零。除了對Nyquist進行調零之外,它還將Nyquist-2到Nyquist + 2(「+( - 2:2)」部分)中的下一個最高頻率清零。在這個例子中,頻率範圍是硬編碼的。您必須使用採樣頻率將頻率以Hz爲單位轉換爲相應的FFT bin索引,並將其抽象爲函數,就像您在問題中所做的那樣。 –