Advertisement

图像特征:Harris 角点检测

阅读量:

该算法基于Harris准则设计用于在数字图像中定位特征点。具体而言,在图像的不同区域中,当某一点在其邻域内沿x轴和y轴方向上的亮度变化率都显著时,则被定义为一个角点。从直观角度来看,在同一幅图像中具有独特纹理或形状特征的位置通常被视为关键点多。

1.原理

Harris 角点检测方法基于图像灰度变化率的二阶导数(即 Hessian 矩阵)来确定候选角点位置。 该算法通过计算角点响应函数 (Corner Response Function, CRF) 来评估像素周围区域是否存在角点。 当计算得到的 CRF 值超过设定阈值时,则将该像素标记为角点。

2. 算法步骤

步骤1 计算图像梯度

使用 Sobel 算子或其他梯度算子计算图像在 x 和 y 方向上的梯度 (Gx 和 Gy)。

步骤2 计算梯度乘积: 计算 GxGx, GyGy 和 Gx*Gy。

步骤3 高斯滤波:对梯度乘积进行高斯滤波,以减少噪声的影响。

步骤4 计算角点响应函数 (CRF): 对于每个像素点,计算以下矩阵 M:

复制代码
   M = | Σ Gx*Gx   Σ Gx*Gy |
    
|Σ Gx*Gy   Σ Gy*Gy|

在该像素点为中心的邻域内求和。随后通过计算角点响应函数(CRF):

R = det - k * ^2

该矩阵的行列式通过以下公式计算:
det(M) = (\sum G_x \cdot G_x) \cdot (\sum G_y \cdot G_y) - (\sum G_x \cdot G_y)^2 (M 的行列式)
矩阵的迹通过以下公式计算:
trace(M) = \sum G_x \cdot G_x + \sum G_y \cdot G_y (M 的迹)
其中 k 是一个经验值,在 0.040.06 范围内。

步骤5 阈值处理:将CRF 值与其设定的阈值进行比较;当计算得到的CRF数值超过该阈值时,则判定该像素点为 Interest Point. 步骤6 非极大值抑制:针对提取出的兴趣点,通过非极大值抑制方法去除在检测到的兴趣点中存在冗余,从而有效去除因多次检测而产生的重复兴趣点

3. 函数

OpenCV 提供了 cv2.cornerHarris() 函数来实现 Harris 角点检测。

dst = cv2.cornerHarris

src: 输入图片, 仅限于灰度图且为 float32 类别.
blockSize: 将被用来计算角点响应函数的邻域大小.
ksize: Sobel 算子核尺寸, 用以计算图像梯度.
k: 角点检测中使用的自由参数项, 其取值范围通常介于 0.04 至 0.06 之间.
dst: 计算所得的结果图像是所有检测到的角点响应.

4. 特点

算法的基本原理较为简洁:该算法的设计思路清晰明了。
其运行速度较为迅速:该算法在执行效率方面表现优异,在实际应用中尤其适合应用于实时处理场景。
在一定程度上能够抗干扰:该方法具备较强的抗噪声能力。
对于不同尺度的变化反应较为明显:Harris角点检测对于不同尺度的变化反应较为明显。

5. 应用

图像配准: 基于角点检测的方法能够完成图像配准任务。
物体跟踪: 在视频序列中追踪被跟踪物体的运动情况。
三维重建: 通过角点信息来进行三维重建过程。
运动检测: 识别包含在视频中的移动物体。
图像拼接: 将多幅图片整合到一起形成一个更大规模的画面。

6.代码示例

以下是一个使用 OpenCV 实现 Harris 角点检测的示例代码:

复制代码
 import cv2  
    
 import numpy as np  
    
  
    
 # 1. 读取图像  
    
 img = cv2.imread('./image/chessboard.jpg')  # 替换为你的图像文件名  
    
 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  
    
 gray = np.float32(gray)  # 转换为 float32 类型  
    
  
    
 # 2. Harris 角点检测  
    
 dst = cv2.cornerHarris(gray, 2, 3, 0.04)  
    
  
    
 # 3. 膨胀角点  
    
 dst = cv2.dilate(dst, None)  
    
  
    
 # 4. 设置阈值,将角点标记为红色  
    
 img[dst > 0.001 * dst.max()] = [0, 0, 255]  # BGR 颜色空间  
    
  
    
 # 5. 显示结果  
    
 cv2.imshow('Harris Corners', img)  
    
 cv2.waitKey(0)  
    
 cv2.destroyAllWindows()  
    
    
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/aoXkEx98AtZK3DBRHQ42cpNqfJ5L.png)

代码解释:

获取并转成 grayscale image 以完成图像处理任务。
使用 Harris 角点检测算法来识别图像中的关键特征。
输入参数 gray 代表的是经过预处理后的 grayscale 图像。
其中:
blockSize 设置为 2 表示用于计算 Harris 角点的邻域大小为 2x2。
ksize 设定为 3 表示所使用的 Sobel 算子核尺寸为 3x3。
k 值设定为 0.04 是 Harris 角点检测中的自由调节参数。
增强角点: 对于计算出的 Harris 角点进行形态学处理以提高其可见性。
设置阈值: 将计算得到的 cornerResponse 图像 dst 中每个像素的响应值与其设定的阈值进行对比。
如果 dst 像素响应超过该阈值,则标记该像素位置的颜色为红色。
这里所采用的阈值设定比例是基于 cornerResponse 图像的最大响应值得出,
具体数值设定为 dst.max() 的 1% 即 0.01 * dst.max()。
呈现结果: 展示最终处理后的带有红色标记的角点特征图。

7. 总结

Harris 角点检测是一种该方法用于实现角点检测的一种简单而有效的算法。 该算法通过计算图像灰度强度函数的二阶导数来确定角点位置,并凭借其旋转不变性和高效的计算性能而著称于世。 为了调节其对边缘细节的关注程度以及整体匹配质量,在实现过程中可通过优化设置相关参数以平衡不同性能指标的需求。 但由于其对尺度变化敏感,在某些特定场景下单独使用可能会导致鲁棒性不足的问题

全部评论 (0)

还没有任何评论哟~