J'ai essayé d'appliquer un filtre Gabor avec une échelle spécifique (selon mes valeurs de lambda et sigma, donc c'est ( 7x7 ) et pour 4 orientations (0, , et ) vers une image en échelle de gris en entrée.
Dans mon code, trois étapes sont réalisées:
Créer un filtre Gabor
Lisez une image RVB, puis convertissez-la en échelle de gris et enfin en double.
Appliquez le gabor créé à l'image d'entrée ( ici, je ne sais pas si mon code est vrai, c'est pourquoi j'ai besoin de votre avis )
1) -------------- créer le filtre Gabor (taille = 7x7 et 4 orientations)
%define the five parameters
theta=....; %either 0 or pi/4 or pi/2 or 3pi/4
lambda=3.5;
gamma=0.3;
sigma=2.8;
psi=0;
sigma_x = sigma;
sigma_y = sigma/gamma;
nstds = 5;
xmax = max(abs(nstds*sigma_x*cos(theta)),abs(nstds*sigma_y*sin(theta)));
xmax = ceil(max(1,xmax));
ymax = max(abs(nstds*sigma_x*sin(theta)),abs(nstds*sigma_y*cos(theta)));
ymax = ceil(max(1,ymax));
xmin = -xmax; ymin = -ymax;
[x,y] = meshgrid(xmin:xmax,ymin:ymax);
x_theta=x*cos(theta)+y*sin(theta);
y_theta=-x*sin(theta)+y*cos(theta);
gb= exp(-.5*(x_theta.^2/sigma_x^2+y_theta.^2/sigma_y^2)).*cos(2*pi/lambda*x_theta+psi);
figure(2);
imshow(gb);
title('theta=...');
%imagesc(gb);
%colormap(gray);
%title('theta=...');
2) ------------ Lire l'image d'entrée
I=imread('piano.jpg');
image_resize=imresize(I, [160,160]);
image_gray=rgb2gray(image_resize);
image_double=im2double(image_gray);
figure(1);
imshow(image_double);
3) ----- appliquez le gabor créé ci-dessus à l'image d'entrée (rappelez-vous que je ne suis pas sûr si le code de cette étape est 100% vrai, c'est pourquoi j'ai besoin de votre avis et de votre aide si vous avez la bonne réponse. )
figure(3);
filtered = conv2(image_double,gb);
imagesc(filtered);
colormap(gray);
title('theta=....');
Réponses:
Votre code est correct et les résultats sont cohérents. Vous pourriez être surpris par eux en raison de certaines «fonctionnalités cachées».
Tout d'abord,
conv2
renvoie par défaut la convolution complète, de sorte que le résultat est la taille de l'image plus une bordure de la moitié de la taille du noyau (c'est-à-dire la taille totale si la taille de l'image plus celle du noyau). Lorsque vous interprétez vos résultats, sachez-le!Deuxièmement, les résultats représentent des coefficients plus forts pour une corrélation plus élevée entre votre noyau et votre patch d'image local: comme prévu, vous extrayez également les bordures de l'image. Voir en particulier votre résultat le plus à gauche montrant une forte ligne verticale.
Enfin, met à l'
imagesc
échelle par défaut l'échelle entre le coefficient le plus élevé au coefficient le plus bas. C'est pourquoi dans le résultat le plus à gauche, vous voyez principalement la bordure.Il existe différentes options à
conv2
décrirehelp conv2
qui permettent de contrôler ce comportement.Sachez également qu'il existe de nombreuses définitions différentes des noyaux pour détecter les bords, telles que log-Gabors
.
Si vous êtes intéressé par une implémentation complète (en python), vous pouvez consulter: https://pythonhosted.org/LogGabor/ (self-plug sans vergogne 😇).
la source
Votre code est correct. Il vous suffit de faire la convolution 2D avec le noyau de filtre que vous faites très bien.
Bonne chance
la source