当前位置: 首页 > article >正文

OpenCV:Harris、Shi-Tomasi角点检测

简述

在计算机视觉和图像处理领域,角点是一种重要的特征点,通常是图像中梯度变化剧烈的区域,例如建筑物的拐角、棋盘的交点等。角点检测广泛应用于目标跟踪、运动检测、拼接全景图 等任务。

本文将介绍 Harris 角点检测Shi-Tomasi 角点检测,分析它们的原理、实现方法以及应用场景,并通过代码示例展示它们的实际效果。


1. 什么是角点?

在图像中:

  • 平坦区域:无明显变化(如纯色背景)。
  • 边缘:沿某一方向变化剧烈,但垂直方向变化较小。
  • 角点:在多个方向上都发生剧烈变化,如物体的拐角处。

如何检测角点?
角点检测的基本思想是计算图像窗口在不同方向上的灰度变化,并找到变化最明显的点。Harris 角点检测和 Shi-Tomasi 角点检测都基于这个原理,但实现方式不同。


2. Harris 角点检测

2.1 Harris 角点检测的原理

Harris 角点检测由 Chris Harris 和 Mike Stephens 提出,基于 自相关矩阵(Structure Tensor) 计算每个像素点的变化情况。

Harris 角点检测的数学表达式如下:

R = det(M) - k \times (trace(M))^2

其中:

  • M 是图像窗口的二阶导数矩阵(梯度协方差矩阵)。
  • det(M) trace(M) 分别表示矩阵的行列式和迹。
  • 是经验参数,通常取 0.04 ~ 0.06。

2.2 Harris 角点检测的特点

优点:

  • 计算速度快,适合大规模图像处理。
  • 能检测到旋转不变的角点。

缺点:

  • 对噪声敏感,容易误检测。
  • 不能区分最优的角点(即可能会选择一些不稳定的角点)。

2.3 Harris 角点检测的示例

 代码示例:

import cv2
import numpy as np

# Harris点
# 光滑地区,无论向哪里移动,衡量系数不变
# 边缘地址,垂直边缘移动时,衡量系数变化剧烈
# 在交点处,往哪个方向移动,衡量系数都变化剧烈

# 读取图像
image = cv2.imread("D:\\resource\\filter\\shudu.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Harris角点检测
harris = cv2.cornerHarris(gray, 2, 3, 0.04)

#harris 角点检测展示
image[harris >0.01*harris.max()] = [0,0,255]

# 显示结果
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 运行效果:

接口说明:

cv2.cornerHarris() 是 OpenCV 提供的 Harris 角点检测 函数,用于检测图像中的角点。

cv2.cornerHarris(src, blockSize, ksize, k)

参数说明: 

参数说明
src输入图像(灰度图),类型必须为 np.float32
blockSize角点检测计算窗口的大小,通常取 2 或 3
ksizeSobel 算子的卷积核大小,通常取 3
kHarris 角点响应公式中的自由参数,通常取 0.04 ~ 0.06

3. Shi-Tomasi 角点检测

3.1 Shi-Tomasi 角点检测的原理

Shi-Tomasi 角点检测是 Harris 角点检测的改进版。它基于最小特征值法,认为:

一个好的角点,其最小特征值应该足够大。

Shi-Tomasi 角点检测的公式:

R = min(\lambda _{1}, \lambda_{2})

其中:

  • λ1​,λ2​ 是特征矩阵的两个特征值。 

相比 Harris 角点检测,Shi-Tomasi 直接使用最小特征值进行排序,而不是计算 RRR 值,能够得到更稳定的角点。

3.2 Shi-Tomasi 角点检测的特点

优点:

  • 更稳定:选出的角点质量更高,适用于目标跟踪。
  • 噪声鲁棒性更强,不易误检测。

缺点:

  • 计算比 Harris 角点略慢。

3.3 Shi-Tomasi 角点检测的示例

代码示例:

import cv2
import numpy as np

# 读取图像
image = cv2.imread("D:\\resource\\filter\\shudu.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Harris角点检测
# harris = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)

# harris 角点检测展示
# image[harris >0.01*harris.max()] = [0,0,255]

corners = cv2.goodFeaturesToTrack(gray, maxCorners=1000, qualityLevel=0.1, minDistance=10)
corners = np.int0(corners)

# Shi-Tomasi绘制角点
for i in corners:
    x,y = i.ravel()
    cv2.circle(image, (x,y), 3, (0,0,255), -1)

# 显示结果
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行效果:

接口说明:

cv2.goodFeaturesToTrack() 是 OpenCV 提供的一种 Shi-Tomasi 角点检测 方法,适用于跟踪的优质特征点算法。它是一种改进版的 Harris 角点检测,可以找到更稳定的角点。

cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance, mask=None, blockSize=3, useHarrisDetector=False, k=0.04)

 参数说明:

参数名说明
image输入图像(必须是 单通道灰度图 np.uint8 类型)。
maxCorners设定最大角点数量,若检测到的角点数目大于 maxCorners,则返回最强的 maxCorners 个角点。
qualityLevel角点的 最低质量阈值,取值范围 0~1,数值越高,选出的角点质量越高,但数量会减少。
minDistance角点间的 最小欧式距离(单位:像素)。若检测到的两个角点距离小于 minDistance,则剔除其中一个。
mask可选参数,设定一个 ROI 掩码(None 表示检测整幅图像)。
blocksize计算角点时使用的 窗口大小(默认为 3)。
useHarrisDetector是否使用 Harris 角点检测器(默认为 False,即使用 Shi-Tomasi 算法)。
k仅在 useHarrisDetector=True 时生效,表示 Harris 角点检测的 自由参数(通常取 0.04)。

    4. Harris 与 Shi-Tomasi 角点检测的差异

    特性Harris 角点检测Shi-Tomasi 角点检测
    检测原理角点响应值 R最小特征值 λ
    稳定性稍逊更稳定,角点质量更优
    噪声鲁棒性较差较好
    适用场景结构分析运动跟踪、目标检测

    选择建议:

    • 需要检测更多角点、对噪声不敏感 → Harris
    • 需要检测高质量角点、用于目标跟踪 → Shi-Tomasi

    5. 应用场景

    5.1 目标跟踪 🎯

    使用 Shi-Tomasi 角点 提取关键点,并结合 光流法(Lucas-Kanade Optical Flow)实现目标跟踪。

    5.2 图像配准 📸

    在两张图像中检测角点(如 SIFT/SURF + Harris 角点),进行特征点匹配。

    5.3 三维重建 🏗

    通过多张图片检测角点,建立点云模型,重建3D 物体。


    6. 总结

    Harris 角点检测 基于矩阵行列式和迹,检测速度快,但对噪声敏感。Shi-Tomasi 角点检测 基于最小特征值,角点质量更高,适用于目标跟踪。在目标跟踪、图像匹配、3D 重建等任务中,Shi-Tomasi 角点通常表现更优。


    http://www.kler.cn/a/527582.html

    相关文章:

  • 代码随想录34 动态规划
  • HyperLogLog 近似累计去重技术解析:大数据场景下的高效基数统计
  • 数据库性能优化(sql优化)_SQL执行计划03_yxy
  • java求职学习day23
  • golang面试题
  • C#,入门教程(13)——字符(char)及字符串(string)的基础知识
  • 【小白学AI系列】NLP 核心知识点(六)Softmax函数介绍
  • 如何优化轮式移动机器人的运动稳定性?
  • 仿真设计|基于51单片机的低频信号控制系统仿真
  • PostgreSQL图插件AGE
  • DeepSeek-R1 论文解读 —— 强化学习大语言模型新时代来临?
  • Java 泛型<? extends Object>
  • 小程序-基础加强
  • 最新Java开发进阶!Java进阶面试资料无偿分享_java面试最新资料
  • SpringBoot入门:快速构建第一个Web应用
  • 需求分析应该从哪些方面来着手做?
  • 高低频混合组网系统中基于地理位置信息的信道测量算法matlab仿真
  • 手摸手系列之 DeepSeek-R1 开源大模型私有化部署解决方案
  • Linux_线程同步生产者消费者模型
  • 适合超多氛围灯节点应用的新选择
  • springboot 2.7.6 security mysql redis jwt配置例子
  • 【股票数据API接口36】如何获取股票当天逐笔大单交易数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
  • 仿真设计|基于51单片机的温室环境监测调节系统
  • C++实现状态模式
  • 如何选择Spring AOP的动态代理?JDK与CGLIB的适用场景
  • python 语音识别