一尘不染

实施哈里斯拐角检测器

algorithm

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

  1. 计算x和y方向上的图像强度梯度
  2. 模糊输出的(1)
  3. 根据输出(2)计算哈里斯响应
  4. 在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,这似乎太低了。


阅读 318

收藏
2020-07-28

共1个答案

一尘不染

哈里斯拐角检测中的一个拐角被定义为“区域中的最高像素”(通常为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)
2020-07-28