• 通俗易懂-OpenCV角点检测算法(Harris、Shi-Tomas算法实现)


    目录

    1 图像的特征

    2,Harris角点检测

    2.1  代码实现

    2.2结果展示

    3,Shi-Tomasi角点检测算法

    3.1 , 代码实现

    3.2结果展示


    Harris角点检测和Shi-Tomasi角点检测都是常用的基于图像灰度变化的角点检测算法,它们可以在图像中找到具有显著灰度变化的角点。

    Harris角点检测算法基于Harris角点响应函数,该函数可以评估图像某一像素周围区域内的灰度变化。考虑一个图像上的像素点P(x, y),其周围区域内的灰度变化可以通过计算自相关矩阵来表示。自相关矩阵M的定义如下:

    M = ∑(∇I(x, y) ∇I(x, y)T)

    其中∇I(x, y)是图像在位置(x, y)处的梯度向量。Harris角点响应函数R的定义如下:

    R = det(M) - k * trace(M)^2

    其中det(M)表示M的行列式,trace(M)表示M的迹,k是一个常数,用来调节响应函数的灵敏度。Harris角点检测的基本思想是,当图像中存在角点时,自相关矩阵的特征值会发生较大的变化,因此通过计算每个像素点的Harris响应函数,可以判断该点是否为角点。

    在OpenCV中,可以使用cv2.cornerHarris()函数实现Harris角点检测。该函数接受输入图像和角点检测的参数(如窗口大小和k值),并返回一个表示角点响应函数的图像。可以通过设定一个阈值来选择具有较大角点响应的像素点作为角点。

    Shi-Tomasi角点检测算法是Harris角点检测算法的一种改进。在Shi-Tomasi算法中,使用了响应函数的最小特征值来代替Harris角点响应函数R。Shi-Tomasi角点响应函数定义如下:

    R = min(λ1, λ2)

    其中λ1和λ2是自相关矩阵M的特征值,表示该像素点的灰度变化程度。与Harris角点检测不同,Shi-Tomasi算法选择了最小特征值作为判断角点的依据。

    在OpenCV中,可以使用cv2.goodFeaturesToTrack()函数实现Shi-Tomasi角点检测。该函数接受输入图像、期望检测的角点数量和质量水平参数等,返回指定数量的最佳角点。

    总的来说,Harris角点检测和Shi-Tomasi角点检测都是基于图像灰度变化的角点检测算法。它们通过计算每个像素点的响应函数来判断是否为角点,并提供了在OpenCV中实现的函数。根据具体应用的需求和图像特点,选择适当的角点检测算法可以提取出图像中的关键信息。

    1 图像的特征

    2,Harris角点检测

    2.1  代码实现

    1. import cv2 as cv
    2. import matplotlib.pyplot as plt
    3. import numpy as np
    4. from pylab import mpl
    5. mpl.rcParams['font.sans-serif'] = ['SimHei']
    6. img = cv.imread("corner.png")
    7. gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    8. #角点检测
    9. #输入图像必须是float32
    10. gray = np.float32(gray)
    11. #最后一个参数在0.04-0.05之间
    12. dst = cv.cornerHarris(gray , 2,3,0.04) #dst变量是一个和输入灰度图像大小相同的浮点类型的矩阵,其中每个像素的值表示该像素是否是角点的概率。
    13. '''gray:输入的灰度图像。
    14. 2:表示Sobel算子内核的大小,用于计算角点响应函数的导数。通常使用的是3x3或5x5的内核大小。
    15. 3:表示邻域窗口的大小,用于计算角点响应函数的响应值。对于每个像素点,计算其与周围像素之间的差异。
    16. 0.04:表示角点响应函数的自由参数k。k的值较小将使检测到的角点更加敏感,而k的值较大则会减少角点数量。'''
    17. #设置阈值,将角点绘制出来,阈值根据图像进行选择
    18. img[dst >0.001*dst.max()] = [0,0,255]
    19. '''它会将图像 img 中响应值大于 0.001 * dst.max() 的像素点设为 [0, 0, 255],即红色。
    20. 请注意,dst.max() 表示检测到的角点响应函数的最大值。
    21. 通过乘以 0.001 ,可以设置一个相对较小的阈值,以便只有极具代表性的角点被标记为红色。你可以根据需要调整阈值大小'''
    22. #图像显示
    23. plt.figure(figsize=(5,4),dpi=100)
    24. plt.imshow(img[:,:,::-1]),plt.title("Harris角点检测")
    25. plt.xticks([]),plt.yticks([])
    26. plt.show()

    2.2结果展示

    3,Shi-Tomasi角点检测算法

    3.1 , 代码实现

    1. import cv2 as cv
    2. import matplotlib.pyplot as plt
    3. import numpy as np
    4. from pylab import mpl
    5. mpl.rcParams['font.sans-serif'] = ['SimHei']
    6. img = cv.imread("corner.png")
    7. gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    8. #角点检测
    9. corners = cv.goodFeaturesToTrack(gray , 1000,0.1,10)
    10. '''
    11. gray:输入的灰度图像。
    12. 1000:表示要检测的角点数量。这里设置为1000,表示最多检测1000个角点,但实际检测到的角点数量可能会少于这个值。
    13. 0.01:表示角点质量水平阈值,用于筛选保留哪些角点。较大的阈值会筛选出更强的角点。
    14. 10:表示角点之间的最小欧氏距离。如果两个角点之间的距离小于这个值,其中一个角点将被抑制。
    15. '''
    16. #绘制角点
    17. for i in corners:
    18. x,y = i.ravel()
    19. cv.circle(img,(x,y),2,(0,0,255),-1)
    20. #图像显示
    21. plt.figure(figsize=(5,4),dpi=100)
    22. plt.imshow(img[:,:,::-1]),plt.title("shi-Tomas角点检测")
    23. plt.xticks([]),plt.yticks([])
    24. plt.show()

    3.2结果展示

  • 相关阅读:
    腾讯音乐评论审核、分类与排序算法技术
    EA&UML日拱一卒 用例包含关系
    C++证明四方定理
    软件过程与项目管理复习(1)
    LeetCode - 1419 数青蛙
    椎弓根三角新算法
    为啥python’hello‘>‘world‘是false
    Self-adaptive Differential Evolution Algorithm for Numerical Optimization
    【Rust 笔记】17-并发(下)
    web3j solidity 转java
  • 原文地址:https://blog.csdn.net/qq_53545309/article/details/133298628