我在 OpenCV 中使用 cornerHarris 函数。我无法理解 ksizek 在函数中的含义。文档提到 ksizeAperture parameter of Sobel derivative usedkHarris detector free parameter in the equation 但我不确定它到底是什么意思?

有人可以帮我理解吗?

我试图检测立方体中的角,结果如下:

python - 角哈里斯中的 ksize 和 k 是什么意思?-LMLPHP

使用我从文档中使用的简单代码:

    import cv2
    import numpy as np

    filename = "cube.jpg"

    img = cv2.imread("./images/{}".format(filename))

    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    gray = np.float32(gray)
    dst = cv2.cornerHarris(gray,12,3,0.04)

    dst = cv2.dilate(dst,None)

    # Threshold for an optimal value, it may vary depending on the image.
    img[dst>0.01*dst.max()]=[0,0,255]

    cv2.imshow('dst',img)
    if cv2.waitKey(0) & 0xff == 27:
        cv2.destroyAllWindows()

我尝试调整 K 但无法理解它的作用,尽管我意识到将其增加到超出限制会导致检测到零角。

最佳答案

Harris 角点检测器用于从灰度图像中提取角点。
Harris 检测器首先计算图像梯度,然后计算梯度的协方差,它是局部 Hessian 的近似值。

它有4个主要步骤:

  • 边缘检测(空间导数计算) - 第一步是将灰度图像转换为边缘图像。有很多技术可以做到这一点,但 cv2 使用称为 Sobel 内核的过滤器,它与原始图像互相关。 ksize 参数确定 Sobel 内核的大小(3x3、5x5 等)。随着 大小增加 ,每个卷积过程中包含更多像素, 边缘将变得更加模糊
  • 结构张量设置 - 基本上我们构建一个矩阵 M,它表示图像每个点的梯度(边缘)方向。然后可以使用该矩阵来确定哪些边缘像素是角点:

  • python - 角哈里斯中的 ksize 和 k 是什么意思?-LMLPHP
  • Harris 响应计算 - 在这一步中,我们计算每个边缘像素的“角点得分”R。这个想法是,只有当一个像素在 2 个垂直方向上具有大梯度时,才将其定义为角,这意味着 M 矩阵具有 2 个大特征值(1 个大特征值将只是一个边缘)。
    在这里我们可以看到 Harris 检测器的自由参数 - k 。它是一个在 [0.04,0.06] 范围内的经验确定的常数:

  • python - 角哈里斯中的 ksize 和 k 是什么意思?-LMLPHP

    k 参数 可让您在此步骤中施加影响,权衡精度和召回率。因此,使用 较大的 k,您将获得更少的假角 但您也会错过更多真实的角落(高精度),使用 较小的 k 您将获得更多的角落 ,因此您将错过更少的真实角落,但是得到很多错误的(高召回率)。
  • 非极大值抑制 - 找到每个局部区域中角像素的极大值,其余的被抑制。
  • 关于python - 角哈里斯中的 ksize 和 k 是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54720646/

    10-12 20:00