Zastosuj filtr Gabor do obrazu wejściowego

11

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

W moim kodzie osiągnięto trzy kroki:

  1. Utwórz filtr Gabor

  2. Odczytaj obraz RGB, a następnie przekonwertuj go na skalę szarości i ostatecznie podwoj.

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

wprowadź opis zdjęcia tutaj

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

wprowadź opis zdjęcia tutaj

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

wprowadź opis zdjęcia tutaj

Liszt
źródło
Ponadto, jeśli używasz conv2, użyj go z tą samą opcją.
Tolga Birdal
Błąd: Plik: praktyka1.m Wiersz: 3 Kolumna: 7 Wyrażenie po lewej stronie znaku równości nie jest prawidłowym celem dla zadania. Znalazłem ten błąd, kiedy uruchomiłem ten kod
Engr Rao Zaka
ten filtr nie jest 7x7?
jiggunjer,

Odpowiedzi:

1

Twój kod jest poprawny, a wyniki są spójne. Możesz być zaskoczony przez nich z powodu niektórych „ukrytych funkcji”.

Po pierwsze, conv2domyś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 imagesckoniec 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 conv2opisania, w help conv2któ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

różne typy filtrów.

Jeśli jesteś zainteresowany pełną implementacją (w python), możesz spojrzeć na: https://pythonhosted.org/LogGabor/ (bezwstydna wtyczka 😇).

meduz
źródło
0

Twój kod jest poprawny. Musisz po prostu wykonać splot 2D w jądrze filtra, co robisz bardzo dobrze.

Powodzenia

Ujjwal Aryan
źródło
Nie jestem w stanie cię zrozumieć. Robisz konwolucję 2-D (ponieważ używasz funkcji conv2). Innym sposobem jest przejście do zwielokrotnienia w dziedzinie częstotliwości (ponieważ splot w dziedzinie czasu lub przestrzeni jest równoważny zwielokrotnieniu w dziedzinie częstotliwości). Jednak nie musisz tego robić, ponieważ conv2 zasadniczo robi to samo (wewnętrznie !!!)
Ujjwal Aryan
Dokładnie :) ,, znasz model HMAX? (warstwy S1, C1, S2, C2 ...). Próbuję teraz obliczyć warstwę C1 (maksymalna operacja między jednostkami S1), czy znasz jakieś pomysły na ten temat (kod Matlab)?
Liszt