我正在使用来自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矩阵的所有值都是负数,其中一些是非常大的负数。这有什么不对吗?如果是这样,我无法弄清楚我的代码有什么问题。你可以帮我解决一下吗?
这是原始图片:
以下是我的函数的输出,但没有在Ix
和Iy
矩阵上应用具有负值的任何高斯内核:
以下是在Ix
和Iy
矩阵上应用Sigma 1-3的高斯内核后的函数的输出。应用高斯核后,R矩阵的最小值将为0!
然而,这是R矩阵的值是负的,最大值是0!
我完全不知道如何检测角落。我可能会注意到我没有MATLAB的计算机视觉工具箱。
答案 0 :(得分:3)
C
的等式似乎错了。尝试:
C = (Ix.*Iy).^2; % was .^4
此外,您通常使用高斯平滑Ix
和Iy
。 MATLAB过滤A
,B
和C
,其中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矩阵的元素:
示例代码:
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
的功能。