使用Gabor滤波器进行图像处理

4

我正在尝试在图像上执行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.

不确定如何解决这个问题...在此输入图像描述

在此输入图像描述


“J”是什么?请记住,conv2将在此处返回一个矩阵,但您正在尝试将其存储在J(i,j)中。 - Vidar
2个回答

4
K = exp(2*pi*theta*i(xprime+ yprime));中,你漏掉了*符号,应该在i和括号之间加上。修正后应该是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));

首先感谢您的回复。但是在我纠正了那个错误之后,又出现了另一个错误:“下标赋值维度不匹配”。有什么想法吗? - cnn lakshmen
再次感谢。但是现在我的输出是一张黑色图像。我根本没有得到任何Gabor特征... - cnn lakshmen
Gabor特征是什么意思?你有在做的那本书或论文的链接吗? - Phonon
你确定这段代码是正确的吗?我更新了它,现在它可以正常工作。但是你使用了特定的phi值吗?我不能使用phi=0和theta=90吗?还有为什么sigma要等于0.65乘以theta?长宽比和lambda值在哪里呢?请回答我:)我需要你的帮助。 - Liszt
这是Gabor滤波器的正确方程吗?这个方程和http://dsp.stackexchange.com/questions/11448/apply-gabor-filter-to-an-input-image-using-matlab中提出的另一个方程有所不同。 - Liszt
显示剩余3条评论

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接