Próbowałem zastosować filtr Gabor o określonej skali (zgodnie z moimi wartościami lambda i sigma, więc jest to ( 7x7 ) i dla 4 orientacji (0, , i ) do wejściowego obrazu w skali szarości.
W moim kodzie osiągnięto trzy kroki:
Utwórz filtr Gabor
Odczytaj obraz RGB, a następnie przekonwertuj go na skalę szarości i ostatecznie podwoj.
Zastosuj utworzony gabor do obrazu wejściowego ( tutaj nie jestem pewien, czy mój kod jest prawdziwy, dlatego potrzebuję twojej opinii )
1) -------------- utwórz filtr Gabor (rozmiar = 7x7 i 4 orientacje)
%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) ------------ Przeczytaj obraz wejściowy
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) ----- zastosuj utworzony powyżej gabor do obrazu wejściowego (pamiętaj, że nie jestem pewien, czy kod w tym kroku jest w 100% prawdziwy, dlatego potrzebuję twojej opinii i twojej pomocy, jeśli masz poprawną odpowiedź. )
figure(3);
filtered = conv2(image_double,gb);
imagesc(filtered);
colormap(gray);
title('theta=....');
Odpowiedzi:
Twój kod jest poprawny, a wyniki są spójne. Możesz być zaskoczony przez nich z powodu niektórych „ukrytych funkcji”.
Po pierwsze,
conv2
domyślnie zwraca pełny splot, tak że wynikiem jest rozmiar obrazu powiększony o połowę rozmiaru jądra (to jest całkowity rozmiar, jeśli rozmiar obrazu plus rozmiar jądra). Kiedy interpretujesz swoje wyniki, pamiętaj o tym!Po drugie, wyniki reprezentują współczynniki, które są silniejsze dla większej korelacji między twoim jądrem a lokalną łatą obrazu: zgodnie z oczekiwaniami, wyodrębniasz również granice obrazu. Zobacz w szczególności swój wynik po lewej stronie, pokazujący silną linię pionową.
Na
imagesc
koniec skaluje domyślnie skalę od najwyższego do najniższego współczynnika. Dlatego w wyniku najbardziej na lewo widać głównie granicę.Istnieją różne opcje do
conv2
opisania, whelp conv2
których pozwalają kontrolować to zachowanie.Pamiętaj również, że istnieje wiele różnych definicji jądra do wykrywania krawędzi, takich jak log-Gabors
.
Jeśli jesteś zainteresowany pełną implementacją (w python), możesz spojrzeć na: https://pythonhosted.org/LogGabor/ (bezwstydna wtyczka 😇).
źródło
Twój kod jest poprawny. Musisz po prostu wykonać splot 2D w jądrze filtra, co robisz bardzo dobrze.
Powodzenia
źródło