Aplique um filtro Gabor a uma imagem de entrada

11

Tentei aplicar um filtro Gabor com uma escala específica (de acordo com meus valores de lambda e sigma, por isso é ( 7x7 ) e para 4 orientações (0, , e ) para uma imagem em escala de cinza de entrada.π4π23π4

No meu código, três etapas são alcançadas:

  1. Criar um filtro Gabor

  2. Leia uma imagem RGB, depois converta-a em escala de cinza e, finalmente, em dobro.

  3. Aplique o gabor criado à imagem de entrada ( aqui, não tenho certeza se meu código é verdadeiro, é por isso que preciso da sua opinião )

1) -------------- crie o filtro Gabor (tamanho = 7x7 e 4 orientações)

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

insira a descrição da imagem aqui

2) ------------ Leia a imagem 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);

insira a descrição da imagem aqui

3) ----- aplique o gabor criado acima à imagem de entrada (lembre-se de que não tenho certeza se o código nesta etapa é 100% verdadeiro, é por isso que preciso da sua opinião e sua ajuda, se você tiver a resposta correta. )

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

insira a descrição da imagem aqui

Liszt
fonte
Além disso, se você estiver usando conv2, use-o com a opção 'mesmo'.
precisa saber é o seguinte
Erro: Arquivo: practise1.m Linha: 3 Coluna: 7 A expressão à esquerda do sinal de igual não é um destino válido para uma atribuição. Eu encontrei este erro quando eu executar esse código
Engr Rao Zaka
esse filtro não é 7x7?
Jggunjer

Respostas:

1

Seu código está correto e os resultados são consistentes. Você pode se surpreender com eles devido a alguns "recursos ocultos".

Primeiro, conv2retorna por padrão a convolução completa, de modo que o resultado seja o tamanho da imagem mais uma borda da metade do tamanho do kernel (ou seja, o tamanho total se o tamanho da imagem mais o tamanho do kernel). Ao interpretar seus resultados, esteja ciente disso!

Segundo, os resultados representam coeficientes mais fortes para uma correlação mais alta entre o kernel e o patch de imagem local: como esperado, você também extrai as bordas da imagem. Veja em particular o resultado mais à esquerda, mostrando uma forte linha vertical.

Por último, imagescdimensiona por padrão a escala entre o maior e o menor coeficiente. Por isso, no resultado mais à esquerda, você vê principalmente a borda.

Existem diferentes opções conv2descritas nas help conv2quais permitem controlar esse comportamento.

Esteja ciente também de que existem muitas definições diferentes de kernels para detectar arestas, como log-Gabors

diferentes tipos de filtros.

Se você estiver interessado em uma implementação completa (em python), consulte: https://pythonhosted.org/LogGabor/ (auto-plug descarado 😇).

meduz
fonte
0

Seu código está correto. Você simplesmente precisa fazer a convolução 2-D com o kernel de filtro que você está fazendo muito bem.

Boa sorte

Ujjwal Aryan
fonte
Eu não sou capaz de entender você. Você está fazendo a convolução 2-D (como está usando a função conv2). Outro caminho é ir para a multiplicação no domínio da frequência (porque a convolução no domínio do tempo ou no espaço é equivalente à multiplicação no domínio da frequência). No entanto, você não precisa fazer isso, pois conv2 faz essencialmente a mesma coisa (internamente !!!)
Ujjwal Aryan
Exatamente :), você conhece o modelo HMAX? (as camadas S1, C1, S2, C2 ...). Agora estou tentando calcular a camada C1 (operação máxima entre unidades S1), você conhece algumas idéias sobre isso (código matlab)?
Liszt