【问题标题】:Serial Gabor filter output trouble串行 Gabor 滤波器输出故障
【发布时间】:2014-08-19 04:53:44
【问题描述】:

这是串行 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

输出图像如下所示:

【问题讨论】:

    标签: matlab image-processing


    【解决方案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);
    

    【讨论】:

    • 很抱歉回复晚了,但是非常感谢它的工作方式就像我想要的那样,只是有时错误正盯着你看,你无法弄清楚....再次感谢
    • @akshay - 不客气。如果我的帖子对您​​有帮助,请考虑接受。单击我帖子顶部的复选标记图标,在向上和向下投票按钮下方的左侧。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-12-11
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2012-02-14
    • 2014-07-14
    • 2015-10-24
    相关资源
    最近更新 更多