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

2024-06-28 11:02:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我在OpenCV中玩cornerHarris函数。我不明白ksize和{}在函数中是什么意思。文档中提到ksizeAperture parameter of Sobel derivative used,而{}是{},但我不确定这到底是什么意思?在

有人能帮我理解吗?在

我试着在一个立方体中探测角,结果是:

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


Tags: of函数文档importimgparameternpfilename
1条回答
网友
1楼 · 发布于 2024-06-28 11:02:47

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

它有4个主要步骤:

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

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

enter image description here

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

enter image description here

k参数允许您在这一步中进行影响,以牺牲精确度和召回率为代价。所以当k较大时,你会得到较少的假角,但你也会错过更多的真实角点(高精度),当k变小时,你会得到更多的角点,所以你会错过较少的真角,但会得到很多假角(高召回率)。在

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

相关问题 更多 >