Wenden Sie einen Gabor-Filter auf ein Eingabebild an

11

Ich habe versucht, einen Gabor-Filter mit einer bestimmten Skala anzuwenden (entsprechend meinen Werten für Lambda und Sigma, also ( 7x7 ) und für 4 Ausrichtungen (0, , und ) zu einem eingegebenen Graustufenbild.π4π23π4

In meinem Code werden drei Schritte erreicht:

  1. Erstellen Sie einen Gabor-Filter

  2. Lesen Sie ein RGB-Bild, konvertieren Sie es dann in Graustufen und schließlich in Doppel.

  3. Wende den erstellten Gabor auf das Eingabebild an ( hier bin ich mir nicht sicher, ob mein Code wahr ist, deshalb brauche ich deine Meinung )

1) -------------- Erstellen Sie den Gabor-Filter (Größe = 7x7 und 4 Ausrichtungen).

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

Geben Sie hier die Bildbeschreibung ein

2) ------------ Lesen Sie das Eingabebild

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

Geben Sie hier die Bildbeschreibung ein

3) ----- wende den oben erstellten Gabor auf das Eingabebild an (erinnere dich, dass ich nicht sicher bin, ob der Code in diesem Schritt 100% wahr ist, deshalb brauche ich deine Meinung und deine Hilfe, wenn du die richtige Antwort hast. )

figure(3);
filtered = conv2(image_double,gb);
imagesc(filtered);
colormap(gray);
title('theta=....');

Geben Sie hier die Bildbeschreibung ein

Liszt
quelle
Wenn Sie conv2 verwenden, verwenden Sie es bitte mit der gleichen Option.
Tolga Birdal
Fehler: Datei: praktise1.m Zeile: 3 Spalte: 7 Der Ausdruck links vom Gleichheitszeichen ist kein gültiges Ziel für eine Zuweisung. Ich fand diesen Fehler, als ich diesen Code
ausführte
Dieser Filter ist nicht 7x7?
Jiggunjer

Antworten:

1

Ihr Code ist korrekt und die Ergebnisse sind konsistent. Sie können von ihnen aufgrund einiger "versteckter Funktionen" überrascht sein.

Zunächst conv2kehrt standardmäßig die volle Faltung, so dass das Ergebnis die Größe des Bildes ist zuzüglich eine Grenze der halben Größe des Kernels (dh, die Gesamtgröße , wenn die Größe des Bildes und die des Kernel). Wenn Sie Ihre Ergebnisse interpretieren, beachten Sie dies!

Zweitens stellen die Ergebnisse Koeffizienten dar, die für eine höhere Korrelation zwischen Ihrem Kernel und Ihrem lokalen Bildfeld stärker sind: Wie erwartet extrahieren Sie auch die Bildränder. Sehen Sie insbesondere Ihr Ergebnis ganz links mit einer starken vertikalen Linie.

Zuletzt imagescskaliert standardmäßig die Skala zwischen dem höchsten und dem niedrigsten Koeffizienten. Deshalb sehen Sie im Ergebnis ganz links hauptsächlich die Grenze.

Es werden verschiedene Optionen conv2beschrieben, mit help conv2denen dieses Verhalten gesteuert werden kann.

Beachten Sie auch, dass es viele verschiedene Definitionen von Kerneln zum Erkennen von Kanten gibt, z. B. log-Gabors

verschiedene Arten von Filtern.

Wenn Sie an einer vollständigen Implementierung (in Python) interessiert sind, können Sie sich Folgendes ansehen: https://pythonhosted.org/LogGabor/ (schamloser Self-Plug 😇).

meduz
quelle
0

Ihr Code ist korrekt. Sie müssen lediglich die 2-D-Faltung mit dem Filterkern durchführen, was Sie sehr gut machen.

Viel Glück

Ujjwal Aryan
quelle
Ich kann dich nicht verstehen. Sie führen eine 2-D-Faltung durch (da Sie die Funktion conv2 verwenden). Ein anderer Weg ist die Multiplikation im Frequenzbereich (weil die Faltung im Zeit- oder Raumbereich der Multiplikation im Frequenzbereich entspricht). Sie müssen dies jedoch nicht tun, da conv2 im Wesentlichen dasselbe tut (intern !!!)
Ujjwal Aryan
Genau :) ,, kennen Sie das HMAX-Modell? (die Schichten S1, C1, S2, C2 ...). Ich versuche jetzt, die C1-Schicht zu berechnen (maximaler Betrieb zwischen S1-Einheiten). Kennen Sie einige Ideen dazu (Matlab-Code)?
Liszt