【问题标题】:Using the output of harris corner detector to detect corners (A new issue arises)使用 harris 角点检测器的输出来检测角点(出现新问题)
【发布时间】:2023-03-18 23:35:06
【问题描述】:

我正在使用来自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 矩阵的所有值都是负数,其中一些是极大的负数。有什么问题吗?如果是这样,我无法弄清楚我的代码有什么问题。你能帮我解决这个问题吗?

这是原图:

这是我的函数的输出,未在具有负值的 IxIy 矩阵上应用任何高斯核:

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

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

【问题讨论】:

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


    【解决方案1】:

    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

    【讨论】:

    • 谢谢。我刚刚应用了您提到的更改,但是 H 矩阵仍然具有极大的负值且没有正值,并且我不知道如何检测角点。你能帮我解决这个问题吗?
    • 您有负值,因为上面的粗麻布矩阵会产生强烈的边缘响应,这些响应是负的,具体取决于您的图像,如果您没有使用足够大的平滑滤波器对其进行平滑处理,则可能会发生这种情况。您也没有对图像值进行任何边界控制(衍生物;Ix,Iy。)。在平滑之前,我只对 Lena 的标准图像产生了负面结果,在平滑之后产生了一些正值。您的图像也可能是这种情况。祝你好运!
    • 您能再检查一下问题吗?我现在很困惑。我不知道你说的不对 Ix 和 Iy 划定界限是什么意思。
    • @Amir 过滤ABC。使用 2D 内核 k = w(:)*w(:)' 其中w=fspecial('gaussian',[1 5],1.5);。然后计算H,这将为您提供“角落”指标。然后,如果您有图像处理工具箱,您可以使用BW = imregionalmax(cMetric,8); 获得最大值(角)的 2D 蒙版。如果您没有工具箱,请关注this answer for finding local maxima in a 2D matrix
    • @Amir 另请注意,您可能需要根据角点质量应用一些阈值,否则您将有很多弱角。
    【解决方案2】:

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

    在您计算角点响应时 H = (A.B - C) - λ(A+B).^2;

    (A.*B - C) 是行列式 (A + B) 是迹线 这是不正确的,因为您没有获取 M 矩阵的行列式和迹线。相反,您只是获取了每个像素位置的行列式和迹线。执行此操作时,我们应该预期角响应会出现许多强负值,因为 行列式将为零并且生成的响应函数变为 H = -lambda(trace(M)^2)。 p>

    证明:(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 矩阵的元素计算 Harris 响应

    示例代码:

    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);
    

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

    【讨论】:

      【解决方案3】:

      在计算机视觉系统工具箱中有一个函数叫做detectHarrisFeatures

      【讨论】:

      • 那么,是否确认 R 矩阵中的负值是正确的?我需要自己实现该功能以检测功能。你有这方面的资源吗?
      • 您能再检查一下问题吗?我已经编辑了我的问题。
      猜你喜欢
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      相关资源
      最近更新 更多