2017-04-20 12 views
0

Je rencontre des difficultés pour trouver l'erreur dans mon code ou mon raisonnement; Je dois créer manuellement un filtre passe-haut/passe-bas pour traiter une image dans le domaine fréquentiel. Je ne suis pas autorisé à utiliser du beurre(), filtre() et d'autres fonctions connexes.Filtre passe-haut/passe-bas manuel dans MATLAB

Le résultat final que je vise est quelque chose qui est similaire à ce qui est montré ici: link 1, link2.

Pour obtenir ce résultat, je l'ai créé la fonction suivante:

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 

Le masque que je utilise est un cercle blanc sur un bacground noir. Je l'utilise dans le code suivant:

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) 

Le résultat final, cependant, est tout à fait pas ce que je pense! J'ai vérifié les graphiques de fréquence des images et ils semblent bien, avec le filtre cercle placé là où il devrait être, mais les images de sortie sont complètement faux. Pour le filtre passe-haut, l'image de sortie est inchangée. Pour le passe-bas, c'est complètement noir. J'ai essayé de réécrire la fonction plusieurs fois et de jouer avec la façon dont je multiplie les matrices mais mon résultat ne changera pas.

Je suis sûr qu'il me manque quelque chose, mais je n'arrive pas à trouver quoi. S'il vous plaît, aidez-moi s'il vous plaît.

Répondre

1

Utilisez ifft2 et fftshift

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

Je pense aussi que c'est un moyen plus facile de faire un masque avec un cercle au milieu:

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