我正在为教育目的实现哈里斯角检测器,但我被困在哈里斯响应部分。基本上,我正在做的是:
- 计算 x 和 y 方向的图像强度梯度
- (1)的模糊输出
- 计算 Harris 对 (2) 输出的响应
- 在 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 角点检测中的角点被定义为“区域中的最高值像素”(通常为 3X3
或 5x5
),因此您关于没有意义的评论达到了“阈值”对我来说似乎很奇怪。只需收集其周围 5x5
邻域中具有比所有其他像素更高值的所有像素。
除此之外: 我不是 100% 确定,但我认为你应该:
K(j,i) = det(H) - lambda*(trace(H)^2)
其中 lambda 是适用于您的情况的正常数(Harris 建议值为 0.04)。
一般而言,过滤输入的唯一明智时刻是在此之前:
[Ix, Iy] = intensityGradients(img);
过滤 Ix2
、Iy2
和 Ixy
对我来说意义不大。
此外,我认为您的示例代码在这里是错误的(函数 harrisResponse
是否有两个或三个输入变量?):
H = harrisResponse(Ix2, Ixy, Iy2);
[...]
function K = harrisResponse(Ix, Iy)
关于algorithm - 实现 Harris 角点检测器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3862225/