2017-04-20 94 views
0

我正在努力尋找我的代碼或推理中的錯誤;我必須手動創建一個高/低通濾波器來處理頻域中的圖像。我不允許使用butter(),filter()和其他相關函數。MATLAB中的手動高/低通濾波器

最終的結果,我瞄準的東西,類似於下面顯示的那樣:link 1link2

爲了達到這個結果,我創建了以下功能:

function out = hlow2(x,n,mask,u) 
% x - input image 
% n - mask size 
% mask - user-defined mask 
% u - user choice: 1 -> high-pass, anything else -> low-pass 
a=size(x); 
mask=padarray(mask,[floor((a(1)-n)/2) floor((a(2)-n)/2)],'replicate'); 
mask=padarray(mask,[1 1],'replicate','pre'); 
% i am padding the mask array in order to make it fit the image and have my 
% circle filter attached to the "middle" of the frequency graph. 

maskl=logical(mask); 
maskh=~mask; 
maskl=double(maskl); 
maskh=double(maskh); 
% here, i created the high and low pass masks from the user-defined mask. 

x=fft2(x); 

if u==1 
    HP=x.*maskh; 
    out=ifft(HP); 
else 
    LP=x.*maskl; 
    out=ifft(LP); 
end 
end 

我使用的面膜是一個白色的圓圈上的黑色bacground。我在以下代碼中使用它:

mask=imread('circle.png'); 
mask=double(mask)/255; 
mask=mask(:,:,1); 

boat_a=imread('boat.png'); 
boat_a2=double(boat_a)/255; 

c1=hlow2(boat_a2,255,mask,1); 
c2=hlow2(boat_a2,255,mask,2); 


figure() 
imshow(c1) 
figure() 
imshow(c2) 

但是,最終結果完全不是我所期望的!我檢查了圖片頻率曲線圖,他們似乎很好,與放置在它應該是圓形過濾器,但輸出圖像是完全錯誤的。對於高通濾波器,輸出圖像不變。對於低通,它是完全黑色的。我試圖重寫功能幾次,與我乘矩陣,但我的結果是不會改變的方式演奏。

我相信,我失去了一些東西,但我似乎無法找到什麼。請幫助我。

回答

1

使用ifft2和fftshift

x=fft2(x); 
x=fftshift(x); 
if u==1 
    P=x.*maskh; 
else 
    P=x.*maskl; 
end 
P=fftshift(P); 
out=ifft2(P); 

而且我認爲這是使在中間的圓形面具更簡單的方法:

[i,j]=size(im'); 
[x, y] = meshgrid(1:i, 1:j); 
r=20; 
mask=((x-i/2).^2+(y-j/2).^2)<r^2;