Aplicar un filtro Gabor a una imagen de entrada

11

Traté de aplicar un filtro Gabor con una escala específica (de acuerdo con mis valores de lambda y sigma, por lo que es ( 7x7 ) y para 4 orientaciones (0, , y ) a una imagen de escala de grises de entrada.π4π23π4

En mi código, se logran tres pasos:

  1. Crear un filtro de Gabor

  2. Lea una imagen RGB, luego conviértala a escala de grises y finalmente a doble.

  3. Aplique el gabor creado a la imagen de entrada ( aquí, no estoy seguro de si mi código es verdadero, por eso necesito su opinión )

1) -------------- crea el filtro Gabor (tamaño = 7x7 y 4 orientaciones)

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

ingrese la descripción de la imagen aquí

2) ------------ Leer la imagen de entrada

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

ingrese la descripción de la imagen aquí

3) ----- aplique el gabor creado anteriormente a la imagen de entrada (recuerde que no estoy seguro de si el código en este paso es 100% verdadero, por eso necesito su opinión y su ayuda si tiene la respuesta correcta. )

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

ingrese la descripción de la imagen aquí

Liszt
fuente
Además, si está usando conv2, úselo con la misma opción.
Tolga Birdal
Error: Archivo: practise1.m Línea: 3 Columna: 7 La expresión a la izquierda del signo igual no es un objetivo válido para una tarea. Encontré este error cuando ejecuto este código
Engr Rao Zaka
este filtro no es 7x7?
jiggunjer

Respuestas:

1

Su código es correcto y los resultados son consistentes. Puede que te sorprendan debido a algunas 'características ocultas'.

Primero, conv2devuelve por defecto la convolución completa, de modo que el resultado es el tamaño de la imagen más un borde de la mitad del tamaño del núcleo (es decir, el tamaño total si el tamaño de la imagen más el del núcleo). Cuando interpretes tus resultados, ¡ten en cuenta!

En segundo lugar, los resultados representan coeficientes que son más fuertes para una mayor correlación entre su núcleo y su parche de imagen local: como era de esperar, también extrae los bordes de la imagen. Vea en particular su resultado más a la izquierda mostrando una línea vertical fuerte.

Por último, imagescescala por defecto la escala entre el coeficiente más alto y el más bajo. Es por eso que en el resultado más a la izquierda, principalmente se ve el borde.

Hay diferentes opciones para conv2describir help conv2que permiten controlar este comportamiento.

Tenga en cuenta también que existen muchas definiciones diferentes de núcleos para detectar bordes, como log-Gabors

diferentes tipos de filtros.

Si está interesado en una implementación completa (en python), puede echar un vistazo a: https://pythonhosted.org/LogGabor/ (autoenchufe descarado 😇).

Meduz
fuente
0

Tu código es correcto Simplemente necesita hacer la convolución 2-D con el núcleo del filtro que está haciendo muy bien.

Buena suerte

Ujjwal Aryan
fuente
No puedo entenderte. Está haciendo una convolución 2-D (ya que está utilizando la función conv2). Otra forma es optar por la multiplicación en el dominio de la frecuencia (porque la convolución en el dominio del tiempo o el espacio es equivalente a la multiplicación en el dominio de la frecuencia). Sin embargo, no es necesario que haga eso, ya que conv2 esencialmente hace lo mismo (internamente)
Ujjwal Aryan
Exactamente :) ,, ¿conoces el modelo HMAX? (las capas S1, C1, S2, C2 ...). Estoy tratando de calcular la capa C1 (operación máxima entre unidades S1), ¿conoces algunas ideas al respecto (código matlab)?
Liszt