Appliquer un filtre Gabor à une image d'entrée


11

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.π4π23π4

Dans mon code, trois étapes sont réalisées:

  1. Créer un filtre Gabor

  2. Lisez une image RVB, puis convertissez-la en échelle de gris et enfin en double.

  3. 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=...');

entrez la description de l'image ici

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);

entrez la description de l'image ici

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=....');

entrez la description de l'image ici


De plus, si vous utilisez conv2, utilisez-le avec la même option.
Tolga Birdal

Erreur: Fichier: practise1.m Ligne: 3 Colonne: 7 L'expression à gauche du signe égal n'est pas une cible valide pour une affectation. J'ai trouvé cette erreur lorsque j'exécute ce code
Engr Rao Zaka

ce filtre n'est pas 7x7?
jiggunjer

Réponses:


1

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, conv2renvoie 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 à conv2décrire help conv2qui 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

différents types de filtres.

Si vous êtes intéressé par une implémentation complète (en python), vous pouvez consulter: https://pythonhosted.org/LogGabor/ (self-plug sans vergogne 😇).


0

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


Je ne peux pas te comprendre. Vous effectuez une convolution 2D (comme vous utilisez la fonction conv2). Une autre façon consiste à opter pour la multiplication dans le domaine fréquentiel (car la convolution dans le domaine temporel ou spatial équivaut à la multiplication dans le domaine fréquentiel). Cependant, vous n'avez pas besoin de le faire, car conv2 fait essentiellement la même chose (en interne !!!)
Ujjwal Aryan

Exactement :), connaissez-vous le modèle HMAX? (les couches S1, C1, S2, C2 ...). J'essaie maintenant de calculer la couche C1 (opération maximale entre les unités S1), connaissez-vous quelques idées à ce sujet (code matlab)?
Liszt
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.