我出于教育目的而安装了哈里斯拐角检测器,但我陷入了哈里斯 react 部分。基本上,我正在做的是:

  • 计算x和y方向上的图像强度梯度
  • 模糊输出(1)
  • 计算(2)
  • 输出的哈里斯响应
  • 在3x3邻域中抑制(3)的输出中的非最大值,并限制输出

  • 1和2似乎工作正常;但是,随着Harris响应,我得到的值很小,并且没有任何点达到阈值。输入是标准的户外摄影。
    [...]
    [Ix, Iy] = intensityGradients(img);
    g = fspecial('gaussian');
    Ix = imfilter(Ix, g);
    Iy = imfilter(Iy, g);
    H = harrisResponse(Ix, Iy);
    [...]
    
    function K = harrisResponse(Ix, Iy)
        max = 0;
        [sy, sx] = size(Ix);
        K = zeros(sy, sx);
        for i = 1:sx,
            for j = 1:sy,
                H = [Ix(j,i) * Ix(j,i), Ix(j,i) * Iy(j,i)
                    Ix(j,i) * Iy(j,i), Iy(j,i) * Iy(j,i)];
                K(j,i) = det(H) / trace(H);
                if K(j,i) > max,
                    max = K(j,i);
                end
            end
        end
        max
    end
    

    对于示例图片,max最终为6.4163e-018,这似乎太低了。

    最佳答案

    哈里斯拐角检测中的一个拐角被定义为“区域中的最高像素”(通常为3X35x5),因此您对没有点到达“阈值”的评论对我来说似乎很奇怪。只要收集所有值高于其周围5x5邻域中所有其他像素值的像素即可。

    除此之外:
    我不确定100%,但是我认为您应该:
    K(j,i) = det(H) - lambda*(trace(H)^2)其中lambda是在您的情况下有效的正常数(Harris建议值为0.04)。

    通常,在这一点之前,唯一明智的时刻是过滤您的输入:
    [Ix, Iy] = intensityGradients(img);
    过滤Ix2Iy2Ixy对我来说没有多大意义。

    此外,我认为您的示例代码在这里是错误的(函数harrisResponse是否具有两个或三个输入变量?):

    H = harrisResponse(Ix2, Ixy, Iy2);
    [...]
    
    function K = harrisResponse(Ix, Iy)
    

    10-01 06:45