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.
En mi código, se logran tres pasos:
Crear un filtro de Gabor
Lea una imagen RGB, luego conviértala a escala de grises y finalmente a doble.
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=...');
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);
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=....');
Respuestas:
Su código es correcto y los resultados son consistentes. Puede que te sorprendan debido a algunas 'características ocultas'.
Primero,
conv2
devuelve 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,
imagesc
escala 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
conv2
describirhelp conv2
que permiten controlar este comportamiento.Tenga en cuenta también que existen muchas definiciones diferentes de núcleos para detectar bordes, como log-Gabors
.
Si está interesado en una implementación completa (en python), puede echar un vistazo a: https://pythonhosted.org/LogGabor/ (autoenchufe descarado 😇).
fuente
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
fuente