使用哈里斯角点检测器的输出来检测角落(出现新问题)

时间:2014-04-09 21:37:34

标签: matlab image-processing matrix computer-vision corner-detection

我正在使用来自here的Harris角点探测器代码。但是,最终输出“H”具有非常大的负值,最大值为0.我最初使用两个3x3 Sobel掩模对图像进行卷积以提取Ix和Iy矩阵。然后Harris角点检测器函数使用Ix和Iy矩阵来计算Harris

这是我的代码:

IxMask = [-1, 0, 1; -2, 0, 2; -1, 0, 1];
IyMask = [1, 2, 1; 0, 0, 0; -1, -2, -1];
Ix = conv2(double(imread('imageName.jpg')), IxMask);
Iy = conv2(double(imread('imageName.jpg')), IyMask);
A = Ix.^2;
B = Iy.^2;
C = (Ix.*Iy).^2;
lambda = 0.04;

H = (A.*B - C) - lambda*(A+B).^2;

H矩阵的所有值都是负数,其中一些是非常大的负数。这有什么不对吗?如果是这样,我无法弄清楚我的代码有什么问题。你可以帮我解决一下吗?

这是原始图片:

The original picture

以下是我的函数的输出,但没有在IxIy矩阵上应用具有负值的任何高斯内核:

R matrix shown (All values are negative)

以下是在IxIy矩阵上应用Sigma 1-3的高斯内核后的函数的输出。应用高斯核后,R矩阵的最小值将为0! 然而,这是R矩阵的值是负的,最大值是0!

R matrix shown (All values are positive)

我完全不知道如何检测角落。我可能会注意到我没有MATLAB的计算机视觉工具箱。

3 个答案:

答案 0 :(得分:3)

C的等式似乎错了。尝试:

C = (Ix.*Iy).^2;  % was .^4

此外,您通常使用高斯平滑IxIy。 MATLAB过滤ABC,其中2D内核k = w(:)*w(:)'位于w=fspecial('gaussian',[1 5],1.5);

您可能希望使用conv2(...,'same'),或类似地使用filter2

然后,如果您有图像处理工具箱,则可以使用BW = imregionalmax(cornerness,8);获取最大值(角点)的2D蒙版。如果您没有工具箱,请按this answer for finding local maxima in a 2D matrix

答案 1 :(得分:2)

发现了这个帖子,因为我遇到了同样的问题。我能够解决此问题,并认为值得在此处发布我的解决方案。

计算拐角响应时 H =(A. B-C)-lambda (A + B)。^ 2;

(A. * B-C)是决定因素 (A + B)是迹线 这是不正确的,因为您没有获取M矩阵的行列式和迹线。相反,您只是获取了行列式并跟踪每个像素位置。这样做时,我们应该期望拐角响应有很多强的负值,因为行列式将为零,并且结果响应函数将变为H = -lambda(trace(M)^ 2) >

证明:(Ix ^ 2。* Iy ^ 2)-(Ix。* Iy)。^ 2 =(Ix ^ 2。* Iy ^ 2)-(Ix ^ 2。* Iy ^ 2)= 0。

正确的解决方案是首先生成M矩阵的元素:

  1. 在每个像素位置,将围绕该像素的某个窗口上的Ix ^ 2,Iy ^ 2,Ix * Iy求和以生成M矩阵
  2. 计算步骤(1)中计算出的M矩阵的行列式和迹线
  3. 使用M矩阵的元素计算哈里斯响应

示例代码:

IxMask = [-1, 0, 1; -2, 0, 2; -1, 0, 1];
IyMask = [1, 2, 1; 0, 0, 0; -1, -2, -1];
wMask = [1, 1, 1; 1, 1, 1; 1, 1, 1]; 

Ix = conv2(double(imread('imageName.jpg')), IxMask);
Iy = conv2(double(imread('imageName.jpg')), IyMask);

Ix2 = Ix.^2;
Iy2 = Iy.^2;
Ixy = (Ix.*Iy);

M_11 = conv2(Ix2, wMask);
M_12 = conv2(Ixy, wMask);
M_22 = conv2(Iy2, wMask);

det_M = (M_11.*M_22 - M_12.*M_12);
trace_M = (M_11 + M_22);
H = det_M - lambda.*(trace_M.^2);

请注意,我使用了统一的权重函数。实际上,我们将使用高斯。

答案 2 :(得分:0)

计算机视觉系统工具箱中有一个名为detectHarrisFeatures的功能。