使用Gabor滤波器的图像处理

问题描述:

我想对图像执行gabor滤镜。使用Gabor滤波器的图像处理

%% Read 

clear all; 
close all; 
clc; 
I=imread('test.png'); 
imshow(I); 

%% Crop 
I2 = imcrop(I); 
figure, imshow(I2) 
m=size(I2,1); 
n=size(I2,2); 
%% Gabor 
phi = 7*pi/8; 
theta = 2; 
sigma = 0.65*theta; 
for i=1:3 
    for j=1:3 
     xprime= j*cos(phi); 
     yprime= i*sin(phi); 
     K = exp(2*pi*theta*i(xprime+ yprime)); 
     G= exp(-(i.^2+j.^2)/(sigma^2)).*abs(K); 
    end 
end 

%% Convolve 

for i=1:m 
    for j=1:n 
     J(i,j)=conv2(I2,G); 
    end 
end 
imshow(uint8(J)) 

我总是得到这个错误。

??? Subscript indices must either be real positive integers or logicals. 

不知道如何解决这个问题?enter image description here

enter image description here

+0

什么是 “J”?记住conv2会在这里返回一个矩阵,但是你试图把它存储在J(i,j)中。 – Vidar

你缺少i和括号之间K = exp(2*pi*theta*i(xprime+ yprime));一个*。你应该是K = exp(2*pi*theta*i*(xprime+ yprime));。正是由于这种情况,Mathworks建议使用sqrt(-1)作为虚数。

更新: 你不需要循环在Matlab中进行卷积。你干脆说J=conv2(I2,G);

更新2:

这里的工作代码

%% Gabor 
phi = 7*pi/8; 
theta = 2; 
sigma = 0.65*theta; 
filterSize = 6; 

G = zeros(filterSize); 


for i=(0:filterSize-1)/filterSize 
    for j=(0:filterSize-/filterSize 
     xprime= j*cos(phi); 
     yprime= i*sin(phi); 
     K = exp(2*pi*theta*sqrt(-1)*(xprime+ yprime)); 
     G(round((i+1)*filterSize),round((j+1)*filterSize)) = exp(-(i^2+j^2)/(sigma^2))*K; 
    end 
end 

%% Convolve 

J = conv2(I2,G); 
imshow(imag(J)); 
+0

首先感谢回复。但在我纠正后,我有另一个错误。 ???下标分配尺寸不匹配。 有什么想法? –

+0

更新了我的回复。 – Phonon

+0

再次感谢。但现在我得到一个黑色的图像作为输出。我完全可以得到任何gabor功能...... –

根据以上问题的答案,最终的代码之中:

clear all; 
close all; 
clc; 
I=imread('test.png'); 
imshow(I); 

%% Crop 
I2 = imcrop(I); 
figure, imshow(I2) 

    phi = 7*pi/8; 
    theta = 2; 
    sigma = 0.65*theta; 
    filterSize = 6; 

    G = zeros(filterSize); 

    for i=(0:filterSize-1)/filterSize 
     for j=(0:filterSize-1)/filterSize 
      xprime= j*cos(phi); 
      yprime= i*sin(phi); 
      K = exp(2*pi*theta*sqrt(-1)*(xprime+ yprime)); 
      G(round((i+1)*filterSize),round((j+1)*filterSize)) = exp(-(i^2+j^2)/(sigma^2))*K; 
     end 
    end 

    J = conv2(I,G); 
    figure(2); 
    imagesc(imag(J))