串行Gabor滤波器输出故障

时间:2014-08-04 20:23:27

标签: matlab image-processing

这是串行Gabor过滤器的代码。我得到的问题是语句J = J + abc应该返回最终过滤后的图像作为所有过滤器的叠加,但只显示最后一次迭代的结果:

function [J] = gabor(I)

J = zeros(size(I));

for phi = 5*pi/8:pi/8:pi;
    for theta = 1:0.5:2;
        for filterSize = 4:6;
            sigma = 0.65*theta;
            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

        abc = conv2(double(I),double(G),'same');
        J = J + abc;
        end
    end
end
figure; imshow(J);
end

以下是输出图像的样子:

blah

1 个答案:

答案 0 :(得分:1)

我的直觉(或者看起来像......)是你的图像输出类型是double,而imshow只显示[0,1]double之间的强度}。任何低于0或高于1的值都会分别饱和到黑色或白色,这就是为什么您的图像输出只显示为黑色或白色。这一点也很明显,因为J默认为double类型。尝试为imshow命令执行此操作,使其拉伸强度以适应[0,1]范围:

imshow(J, []);  

请注意,此不会修改图片。它只会改变图像的可视化方式。此imshow命令出现在代码的末尾,因此请在此处更改该命令。

顺便说一下,sqrt(-1)被视为不良形式。请改用1j1i,并更改for循环索引,以便您不使用ij,因为这些应该用于代表复数。 Shai显示,使用ij作为循环索引会导致性能不佳。您应该为复数保留这些。请查看此帖子了解详情:Using i and j as variables in Matlab

此外,您可能希望对比拉伸图像,使其适合01。因此,在退出函数之前执行此操作:

J = im2double(J);