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.
In meinem Code werden drei Schritte erreicht:
Erstellen Sie einen Gabor-Filter
Lesen Sie ein RGB-Bild, konvertieren Sie es dann in Graustufen und schließlich in Doppel.
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=...');
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);
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=....');
Antworten:
Ihr Code ist korrekt und die Ergebnisse sind konsistent. Sie können von ihnen aufgrund einiger "versteckter Funktionen" überrascht sein.
Zunächst
conv2
kehrt 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
imagesc
skaliert 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
conv2
beschrieben, mithelp conv2
denen dieses Verhalten gesteuert werden kann.Beachten Sie auch, dass es viele verschiedene Definitionen von Kerneln zum Erkennen von Kanten gibt, z. B. log-Gabors
.
Wenn Sie an einer vollständigen Implementierung (in Python) interessiert sind, können Sie sich Folgendes ansehen: https://pythonhosted.org/LogGabor/ (schamloser Self-Plug 😇).
quelle
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
quelle