algorithm - 实现 Harris 角点检测器

标签 algorithm matlab computer-vision feature-detection corner-detection

我正在为教育目的实现哈里斯角检测器,但我被困在哈里斯响应部分。基本上,我正在做的是:

  1. 计算 x 和 y 方向的图像强度梯度
  2. (1)的模糊输出
  3. 计算 Harris 对 (2) 输出的响应
  4. 在 3x3 邻域和阈值输出中抑制 (3) 输出中的非最大值

1 和 2 似乎工作正常;但是,作为哈里斯响应,我得到的值非常小,而且没有一点达到阈值。输入是标准的户外摄影。

[...]
[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

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

最佳答案

Harris 角点检测中的角点被定义为“区域中的最高值像素”(通常为 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)

关于algorithm - 实现 Harris 角点检测器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3862225/

相关文章:

algorithm - 快速排序,其中数组中的第一个元素较小

c++ - 四边形的面积

linux - 在远程机器上运行 Matlab 任务

python - 如何识别扫描的 PDF 文件中的图像?

matlab - SUN基准代码无效的.mex文件错误

python - cv2.waitkey() 中的不同值是什么意思?

Mysql实现及多字段查询效率

python - 将任务分配给两台打印机的算法?

performance - 划分两个矩阵时的内存和时间问题

matlab - 在 MATLAB 中重构