2011-09-14 68 views
4

我想對圖像執行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

回答

4

你缺少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功能...... –

0

根據以上問題的答案,最終的代碼之中:

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