在cornerHarris中ksize和k是什么意思?

Sop*_*hia 5 python opencv image-processing computer-vision

我在玩OpenCV中的cornerHarris函数。我不明白什么呢ksize,并k在功能上的意思。文档中提到ksize了存在Aperture parameter of Sobel derivative usedk存在,Harris detector free parameter in the equation但我不确定它的真正含义是什么?

有人可以帮我理解吗?

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

在此处输入图片说明

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

    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()
Run Code Online (Sandbox Code Playgroud)

我尝试进行调整,K但不了解它的作用,尽管我意识到将其增加到超过限制会导致检测到零角。

Mar*_*k.F 10

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

它有4个主要步骤:

  1. 边缘检测(空间导数计算)——第一步是将灰度图像转换为边缘图像。有很多技术可以做到这一点,但 cv2 使用称为 Sobel 内核的过滤器,它与原始图像互相关。所述ksize参数确定索贝尔内核(3×3,5×5等。)的大小。随着尺寸的增加,每个卷积过程的像素越来越多,边缘会变得更加模糊

  2. 结构张量设置 - 基本上我们构建一个矩阵 M,它表示图像每个点的梯度(边缘)的方向。然后可以使用该矩阵来确定哪些边缘像素是角点:

在此处输入图片说明

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

在此处输入图片说明

参数k,您可以在此步骤中的影响力,权衡精度和召回。因此,k 越大,假角就越少,但也会错过更多真实角(高精度),k 越小,角就越多,因此您错过的真角就越少,但会得到很多错误的(高召回率)。

  1. 非极大值抑制 - 找到每个局部区域中角像素的极大值,其余的被抑制。