240. Shi-Tomas 角点检测

13. 特征提取

  • Shi-Tomas 算法是对 Harris角点检测算法的改进,一般会比Harris算法得到更好的角点。

一、Shi-Tomas 角检测器

  • Shi-Tomas 算法是对 Harris角点检测算法的改进,一般会比Harris算法得到更好的角点。

  • Harris 算法中的角点响应函数为:
    R =\lambda _1 \lambda _2 - k (\lambda _1 + \lambda _2)^2
    Shi-Tomas 算法将角点响应函数修改为:
    R = min (\lambda _1 , \lambda _2 )
    只有当 M 矩阵的特征值 \lambda _1,\lambda _2 都大于最小值\lambda {min} 时,才将其视为拐角。

  • OpenCV 中提供了 Shi-Tomas 角点检测函数 cv.goodFeaturesToTrack() 。

cv.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance[, corners=None, mask=Mat(), blockSize=3, useHarrisDetector=false, k=0.04]) → corners

函数 cv.goodFeaturesToTrack 通过 Shi-Tomasi 方法找出图像中最突出的 N 个角点。

参数说明:

  • src:输入图像,单通道的 8 位图像或 32 位浮点数图像
    corners:输出向量,检测到的角点
    maxCorners:获取的角点数量的上限阈值
    qualityLevel:可接受的角点质量最低阈值,取值范围 0~1
    minDistance:可接受的角点之间最小的欧式距离
    mask:掩模区域,仅在掩模区域检测角点
    blockSize:邻域尺寸,默认值为 3
    k:Harris 检测器调节参数,默认值 0.04
  • useHarrisDetector :默认值 False,使用 cornerMinEigenVal 的参数,True 表示使用 Harris 检测器

注意事项:

  • 函数使用 cornerMinEigenVal 或 cornerHarris 计算出每个像素的角点响应结果。
  • 以 qualityLevel 与最大角点值相乘作为最小特征值(cornerMinEigenVal)或响应函数值(cornerHarris),小于该值的角点都被拒绝。例如,最大响应值为 1500,系数为 0.1,则响应值小于 150 的角点都被放弃。
  • 小于 maxDistance 距离的角点被拒绝,以避免得到相邻特征点。

二、例程

  • 14.21:特征检测之 Shi-tomas 角检测器
    # 14.21 特征检测之 Shi-tomas 角检测器
    img = cv2.imread("../images/sign04.png", flags=1)  # (300, 300, 3)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # Harris 检测角点
    dst = cv2.cornerHarris(gray, 2, 3, k=0.04)
    # Harris[dst > 0.01*dst.max()] = [0, 0, 255]  # 筛选角点,红色标记
    corners = np.column_stack(np.where(dst>0.1*dst.max()))  # 筛选并返回角点坐标 (y,x)
    corners = corners.astype(np.int)  # 检测到的角点的点集 (y,x), (92, 2)
    imgHarris = np.copy(img)
    for point in corners:  # 注意坐标次序
        cv2.circle(imgHarris, (point[1], point, 4, (0,0,255), 2)  # # 在点 (x,y) 处画圆

    # Shi-tomas 检测角点
    corners = cv2.goodFeaturesToTrack(gray, 30, 0.3, 5)  # (30, 1, 2)
    corners = np.squeeze(corners).astype(np.int)  # (30, 1, 2)->(30,2)  角点坐标 (x,y)
    imgShiTomas = np.copy(img)
    for point in corners:
        cv2.circle(imgShiTomas, point, 4, (0,0,255), 2)  # # 在点 (x,y) 处画圆

    plt.figure(figsize=(9, 6))
    plt.subplot(131), plt.axis('off'), plt.title("Origin")
    plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    plt.subplot(132), plt.axis('off'), plt.title("Harris corners")
    plt.imshow(cv2.cvtColor(imgHarris, cv2.COLOR_BGR2RGB))
    plt.subplot(133), plt.axis('off'), plt.title("Shi-tomas corners")
    plt.imshow(cv2.cvtColor(imgShiTomas, cv2.COLOR_BGR2RGB))
    plt.tight_layout()
    plt.show()

三、资料

youcans_的博客:
https://blog.csdn.net/youcans/article/details/125828053
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容