简述
在计算机视觉和图像处理领域,角点是一种重要的特征点,通常是图像中梯度变化剧烈的区域,例如建筑物的拐角、棋盘的交点等。角点检测广泛应用于目标跟踪、运动检测、拼接全景图 等任务。
本文将介绍 Harris 角点检测 和 Shi-Tomasi 角点检测,分析它们的原理、实现方法以及应用场景,并通过代码示例展示它们的实际效果。
1. 什么是角点?
在图像中:
- 平坦区域:无明显变化(如纯色背景)。
- 边缘:沿某一方向变化剧烈,但垂直方向变化较小。
- 角点:在多个方向上都发生剧烈变化,如物体的拐角处。
如何检测角点?
角点检测的基本思想是计算图像窗口在不同方向上的灰度变化,并找到变化最明显的点。Harris 角点检测和 Shi-Tomasi 角点检测都基于这个原理,但实现方式不同。
2. Harris 角点检测
2.1 Harris 角点检测的原理
Harris 角点检测由 Chris Harris 和 Mike Stephens 提出,基于 自相关矩阵(Structure Tensor) 计算每个像素点的变化情况。
Harris 角点检测的数学表达式如下:
其中:
- M 是图像窗口的二阶导数矩阵(梯度协方差矩阵)。
- det(M) 和 trace(M) 分别表示矩阵的行列式和迹。
- k 是经验参数,通常取 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 |
ksize | Sobel 算子的卷积核大小,通常取 3 |
k | Harris 角点响应公式中的自由参数,通常取 0.04 ~ 0.06 |
3. Shi-Tomasi 角点检测
3.1 Shi-Tomasi 角点检测的原理
Shi-Tomasi 角点检测是 Harris 角点检测的改进版。它基于最小特征值法,认为:
一个好的角点,其最小特征值应该足够大。
Shi-Tomasi 角点检测的公式:
其中:
- λ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 角点通常表现更优。