Applica un filtro Gabor a un'immagine di input


11

Ho provato ad applicare un filtro Gabor con una scala specifica (secondo i miei valori di lambda e sigma, quindi è ( 7x7 ) e per 4 orientamenti (0, ,ππ4 e3ππ2 ) a un'immagine in scala di grigi di input.3π4

Nel mio codice vengono raggiunti tre passaggi:

  1. Crea un filtro Gabor

  2. Leggi un'immagine RGB, quindi convertila in scala di grigi e infine raddoppia.

  3. Applica il gabor creato all'immagine di input ( qui, non sono sicuro che il mio codice sia vero, ecco perché ho bisogno della tua opinione )

1) -------------- crea il filtro Gabor (dimensione = 7x7 e 4 orientamenti)

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

inserisci qui la descrizione dell'immagine

2) ------------ Leggi l'immagine di input

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

inserisci qui la descrizione dell'immagine

3) ----- applica il sopra creato gabor all'immagine di input (ricorda che non sono sicuro che il codice in questo passaggio sia vero al 100%, ecco perché ho bisogno della tua opinione e del tuo aiuto se hai la risposta corretta. )

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

inserisci qui la descrizione dell'immagine


Inoltre, se si utilizza conv2, utilizzarlo con l'opzione "stessa".
Tolga Birdal,

Errore: File: practise1.m Riga: 3 Colonna: 7 L'espressione a sinistra del segno di uguale non è una destinazione valida per un compito. Ho trovato questo errore quando
eseguo

questo filtro non è 7x7?
jiggunjer,

Risposte:


1

Il tuo codice è corretto e i risultati sono coerenti. Potresti essere sorpreso da loro a causa di alcune "funzioni nascoste".

Innanzitutto, conv2restituisce per impostazione predefinita la convoluzione completa, in modo che il risultato sia la dimensione dell'immagine più un bordo della metà della dimensione del kernel (ovvero, la dimensione totale se la dimensione dell'immagine più quella del kernel). Quando interpreti i risultati, sii consapevole di ciò!

In secondo luogo, i risultati rappresentano coefficienti più forti per una maggiore correlazione tra il kernel e la patch dell'immagine locale: come previsto, si estraggono anche i bordi dell'immagine. Vedi in particolare il risultato più a sinistra che mostra una forte linea verticale.

Infine, imagescscala per impostazione predefinita la scala tra il coefficiente più alto e quello più basso. Ecco perché nel risultato più a sinistra, vedi principalmente il bordo.

Esistono diverse opzioni da conv2descrivere in help conv2cui è possibile controllare questo comportamento.

Ricorda inoltre che esistono diverse definizioni di kernel per il rilevamento dei bordi, come Log-Gabors

diversi tipi di filtri.

Se sei interessato a un'implementazione completa (in Python) puoi dare un'occhiata a: https://pythonhosted.org/LogGabor/ (self-plug spudorato 😇).


0

Il tuo codice è corretto Devi semplicemente fare la convoluzione 2-D con il kernel del filtro che stai facendo molto bene.

In bocca al lupo


Non sono in grado di capirti. Stai facendo una convoluzione 2-D (mentre stai usando la funzione conv2). Un altro modo è optare per la moltiplicazione nel dominio della frequenza (perché la convoluzione nel tempo o nel dominio dello spazio equivale alla moltiplicazione nel dominio della frequenza). Tuttavia non è necessario farlo, poiché conv2 essenzialmente fa la stessa cosa (internamente !!!)
Ujjwal Aryan,

Esatto :) ,, conosci il modello HMAX? (gli strati S1, C1, S2, C2 ...). Sto provando ora a calcolare il livello C1 (operazione massima tra unità S1), conosci qualche idea a riguardo (codice matlab)?
Liszt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.