引言
模版匹配是最基础和最简单的图像匹配,即图像和匹配图片具有高度相似性,那么,一般情况下,图像匹配如何实现?
例如图6-1(a)所示的在不同视角下拍摄的建筑物,如何找到两幅图像间的匹配关系?这需要检测图像中的特征进行匹配。说到特征,可能最先想到的就是如图6-1(b)所示的那些特殊位置,如建筑物的顶点。这些局部特征通常被称为关键点特征(keypoint feature)或者兴趣,点特征(interesting point feature)。作为关键点特征,通常需要满足4个性质:
(1)重复性(repeatability),同样的关键点特征应在不同几何变换和光度变换下的图像中都能被检测到
(2)显著性(saliency),每个关键点特征都具有与其他关键点特征不同的区分性描述,通常为其所在位置周围的图像块的表征
(3)紧性(compactness),关键点特征个数要比图像像素数少得多;
(4)鲁棒性(robustness),关键点特征对图像杂乱背景和遮挡具有定的不敏感性。
图6-1(b) 所示的关键点特征就具备上述性质,而且它们都处在两条线(边缘)的交叉点处,所以它们有个形象的名字,角点(corner)。通过匹配两幅图像中对应的角点[图6-1(c)],基于匹配关系计算出两幅图像的变换矩阵,就可以将两幅图像拼接成一幅大图了[图6-1(d)]。在本章中将介绍一个经典的图像角点检测算法—Harris角点检测算法。
Harris角点检测算法原理
角点检测的核心思想是通过分析局部窗口移动时像素值的变化规律来区分平坦区域、边缘和角点。Harris算法基于这一原理,通过数学建模和响应函数计算实现角点定位。
角点特征分析
- 平坦区域:窗口向任意方向移动时,像素值变化量极小。
- 边缘区域:窗口沿边缘方向移动时像素值变化小,垂直边缘方向移动时变化大。
- 角点区域:窗口向任意方向移动时,像素值变化量均较大。
如图p就是一个小窗口
算法实现步骤
1. 计算窗口内像素值变化量
对于图像中每个点 ,假设窗口移动位移为
,像素值变化量 $E(\Delta x, \Delta y)$ 通过泰勒展开近似为:
$$ E(\Delta x, \Delta y) \approx \begin{bmatrix} \Delta x & \Delta y \end{bmatrix} M \begin{bmatrix} \Delta x \ \Delta y \end{bmatrix} $$
其中结构张量 为:
$$ M = \sum_{x,y} w(x,y) \begin{bmatrix} I_x^2 & I_x I_y \ I_x I_y & I_y^2 \end{bmatrix} $$
$I_x$ 和 分别为图像在
和
方向的梯度,
为窗口函数(通常为高斯权重)。
2. 计算角点响应函数
Harris 响应函数 $R$ 定义为:
$$ R = \det(M) - k \cdot \text{trace}(M)^2 $$
其中 ,
(
为
的特征值),
为经验常数(通常取 0.04~0.06)。
角点响应函数与图像区域的关系如图6-6所示,总结如下:
(1)如果P很小,趋于零,对应图像中的平坦区域;
(2)如果P为负数,对应图像中的边缘:
(3)如果P为很大的正数,对应图像中角点。
计算出角点响应函数P后,根据设定的阈值Y对P进行判断,若P>Y,则将此位置判定为
角点。
3. 非极大值抑制与阈值处理
- 对响应函数
进行局部非极大值抑制,排除非局部最大值点。
- 设定阈值
,保留
的点作为角点候选。
代码实现示例(Python + OpenCV)
import cv2
import numpy as np
# 读取图像并转为灰度图
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Harris角点检测
gray = np.float32(gray)
dst = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)
# 膨胀结果以标记角点
dst = cv2.dilate(dst, None)
# 阈值筛选并绘制角点
image[dst > 0.01 * dst.max()] = [0, 0, 255]
cv2.imshow('Harris Corners', image)
cv2.waitKey(0)
参数说明
blockSize
:窗口大小。ksize
:Sobel算子孔径,用于计算梯度。k
:响应函数中的经验常数。
代码运行结果
图片变化对角点检测的影响
在6.1节中提到,特征点对于图像变换具有一定的不变性(重复性)。下面来探讨一下,当图像发生变换,如旋转、平移、缩放等时,检测出的角点是否具有不变性?对图像进行旋转,检测出的角点不变。如图6-7所示,可以很直观地发现,对图像的旋转改变的仅仅是矩阵M的旋转因子R,并不改变其对应的特征值,因此对角点检测没有影响。
同理图像平移也是没有影响的
但是缩放会影响
原来一个角点会变成多个边缘点
小结
本章介绍了一种图像中的特征点----角点,以及Harris角点检测算法。尽管角点对于很多
图像变换具有不变性,是一种常用的图像匹配特征点,但角点对于图像尺度变化不具有不变性,
这也是角点的局限性。那么,是否存在对图像尺度变化不变的特征点呢?第7章介绍的SFT
特征检测将解决这一问题。