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

时间:2019-02-16 06:55:24

标签: python opencv image-processing computer-vision

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

有人可以帮助我理解吗?

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

enter image description here

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

    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,但不了解它的作用,尽管我意识到将其增加到超出限制会导致检测到零角。

1 个答案:

答案 0 :(得分:2)

Harris转角检测器用于从灰度图像中提取转角。 哈里斯探测器的工作原理是首先计算图像梯度,然后计算梯度的协方差,该协方差是局部Hessian的近似值。

它有4个主要步骤:

  1. 边缘检测(空间导数计算)-第一步是将灰度图像转换为边缘图像。有很多技术可以做到这一点,但是cv2使用了一个称为Sobel内核的过滤器,该过滤器与原始图像互相关。 ksize 参数确定Sobel内核的大小(3x3、5x5等)。随着大小的增加,每个卷积过程将包含更多像素,并且边缘将变得更加模糊

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

enter image description here

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

enter image description here

k参数可让您在此步骤中发挥影响,并权衡精度和召回率。因此,当 k较大时,您将获得较少的虚假拐角,但也会错过更多的真实拐角(高精度),而当 k较小时,您将获得更多的拐角 ,因此您不会错过真正的弯角,但会遇到很多错误的弯角(高召回率)。

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