特征点
一个图像的特征点由两部分组成:关键点(keypoint)和描述子(Descriptor)。关键点指的是该特征点在图像中的位置,有些还具有方向、尺度等信息。描述子通常是一个向量,按照人为的设计方式,描述关键点周围像素的信息。通常描述子是按照外观相似的特征应该有相似的描述子设计的。因此,在匹配的时候,只要两个特征点的描述子在向量空间的距离相近,就可以认为它们是同一个特征点。
特征点的匹配通常需要三步:
(1)提取图像中的关键点–查找图像中具有某些特征的像素
(2)根据得到的关键点位置,计算特征点的描述子
(3)根据特征点的描述子,进行匹配
特征检测
在图片中找到感兴趣区域的过程就叫做特征检测。opencv中提供了多个特征检测算法:
- Harris corner detection:角点是在所有方向像素变化剧烈的点,Harris和Stephens提出了检测这样区域的快速方法。opencv:cv2:cornerHarris
- Shi-Tomasi corner detection:通常比Harris更优,它们查找N个最强的角点。opencv:cv2:goodFeaturesToTrack
- Scale-Invariant Feature Transform(SIFT):在图像大小改变时角点检测的效果就不好了,Lowe提出了一个描述图像里与角度大小无关的关键点的方法。在opencv3中,SIFT在contrib模块里。opencv3:cv2:xfeatures2d.SIFT_create()
- Speed-Up Robust Features(SURF):SURF将SIFT中的Laplacian of a Gaussisan(LOG)用一个方框滤波代替(box filter)代替。opencv3:cv2:xfeatures2d.SURF_create()
一般而言,一个物体的角点最能股代表物体的特征,所以特征检测又叫角点(Corner) 检测。
harris是最早的特征提取算法,opencv实现如下:
dst = cv2.conrnerHarris(gray,blockSize=2,ksize=5,k=0.04)
# blockSize - 检测的临点数
# ksize -sobel边缘检测的核
# k -目标函数的一个参数(一般取值较小)
harris corner算法能够解决旋转不变性问题,但不能解决尺度变化问题,由此提出了SIFT算法
SIFT
SIFT(ScaleInvariant Feature Transform,尺度不变特征变换)是一种尺度不变特征检测法。SIFT特征对旋转、尺度旋转、亮度变化等保持不