原文:实例检索︱图像的实例搜索(文献、方法描述、商业案例) - 2017.03.18

作者:悟乙己

主要从中整理关于图像特征化的描述符特征的一些内容.

图像相似性搜索领域,一般先图像特征量化,然后进行相应的匹配.

[1] - 描述符

先抽取图像局部特征符,根据一些匹配算法进行匹对,较多适合在图像比对,人脸比对等领域;

[2] - 描述符的特征

先抽取图像局部特征符,描述符堆砌, 然后降维下来,成为拥有全局信息的图像特征向量,适合形成图指纹;

[3] - 颜色特征

使用直方图,后计算两两之间的误差,较多使其向量化,比较适合多量图像.

[4] - 哈希化

适合大规模搜索,哈希化之后去重,或进行搜索.

[5] - triplet loss 等深度学习特征

深度学习,从图片相似度学习图片的表示

描述符的定义:

理想的特征描述符应该具有:可重复性、可区分性、集中以及高效等特性;还需要能够应对图像亮度变化、尺度变化、旋转和仿射变换等变化的影响.

计算机视觉中通常把角点(corner)作为是图像的特征,而角点能够作为图像特征点的原因有以下两点:

  • [1] - 角点具有唯一的可识别性,当然,这是基于两幅图像没有非常大的差别的前提下适用的;
  • [2] - 角点具有稳定性,换句话说,就是当该点有微小的运动时,就会产生明显的变化.

于是,可以清晰的看到该点的移动,这有利于特征点的跟踪;对于图像上其它的特征描述,如边(edge),区域(patch)等,用数学的语言来描述,就是,这些特征点变化性比较小. 如某一灰度相似的区域,其一阶导数为常数,二阶导数也为常数.

因此,若选取一幅图像中这样的某个区域作为特征,则在另一幅图像中,便很难找到同时满足唯一可识别性和稳定性要求的对应特征.

对于边特征,在垂直于边的方向上,其一阶导数和二阶导数均不为0;但是在平行于边的方向上,则不然.

边特征不适合作为图像的特征. 当发现某个点附近的一阶导数是不断变化时,该点便是角点,可作为图像的特征点.

SIFT、SURF、OBR 三类特征描述符检测.

作者默认为 SIFT/SURF/OBR 这三个是升级版,SIFT->SURF->OBR.

参考:python+OpenCV 特征点检测

1. SIFT 特征

SIFT特征,尺度不变特征变换,scale-Invariant feature transform

2004年提出的Scale Invariant Feature Transform (SIFT) 是改进的基于尺度不变的特征检测器.

该函数会对不同的的图像尺度输出相同的结果. 注意:SIFT并不检测关键点,但SIFT会通过一个特征向量来描述关键点周围区域的情况.

SIFT并不检测DOG(difference of gaussians)

Python 实现:

import cv2
img = cv2.imread('swan.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

sift = cv2.SIFT(200) # max number of SIFT points is 200
kp, des = sift.detectAndCompute(gray, None)

其中 kp 就是特征点,des 就是描述符=200*128维向量.

特征点的属性:

  • kp.pt: 特征点的x,y坐标点
  • kp.size: 特征的直径
  • kp.angle: 特征的方向
  • kp.response: 关键点的强度,用来评估des特征的强度
  • kp.octave: 特征所在金字塔的层级,算法在每次迭代时候,作为参数的图像尺寸和相邻像素都会发生变化
  • kp.class_id: 对象关键点ID

2. SURF 特征

SURF采用快速Hessian算法检测关键点+提取特征.

Surf在速度上比sift要快许多,这主要得益于它的积分图技术,已经Hessian矩阵的利用减少了降采样过程,另外它得到的特征向量维数也比较少,有利于更快的进行特征点匹配.

import cv2
img = cv2.imread('swan.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

surf = cv2.SURF(200) # 200为hessian阈值
kp, des = surf.detectAndCompute(gray, None)

SURF受Hessian阈值影响很大,阈值越高能识别的特征就越少,所以最优的特征可以采用最优检测的方法.

换句话说,SURF抽取的特征点是随机的,不是固定的.

From: SURF算法与SIFT算法的性能比较——图像特征点检测与提取算法分析

3. ORB 特征

一种新的具有局部不变性的特征--ORB特征,从它的名字中可以看出它是对 FAST 特征点与 BREIF 特征描述子的一种结合与改进,这个算法是由 Ethan Rublee,Vincent Rabaud,Kurt Konolige 以及 Gary R.Bradski 在2011年一篇名为“ORB:An Efficient Alternative to SIFT or SURF”的文章中提出.

import cv2
img = cv2.imread('swan.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

orb = cv2.ORB()
kp1, des1 = orb.detectAndCompute(gray,None)

4. SIFT、SURF、OBR 比较

[1] - SURF与SIFT效率对比

一般来说,SURF算法的效率是SIFT算法的3倍左右,而检测出的特征点的个数是SIFT算法的1/3左右,当然也和图像大小、纹理复杂程度、 算法参数设置有关.

如下图,可以看出,SURF算法在边缘抑制上做的似乎没有SIFT好,好多边缘都被检测成了特征点,从而导致特征点个数多于 SIFT.

SIFT算法与SURF算法特征检测效率对比

[2] - 专利情况

ORB是除了SIFT与SURF外一个很好的选择,而且它有很高的效率,最重要的一点是它是免费的,SIFT与SURF都是有专利的,如果在商业软件中使用,需要购买许可.

[3] - 三者在特征点选择的特征

SIFT输出的特征点,可以固定; SURF、OBR,特征点弹性的,比sift要精练一些.

5. 描述符匹配

基于描述符的匹配代表着的意思是,得到特征点之后,匹配两张图,每张图的特征点之间进行匹配.

图中的对等线,就是先得到每张图的特征点,然后特征点-特征点,计算距离.

主要有:

[1] - 暴力匹配,brute-force

遍历描述符,确定描述符是否已经匹配,然后计算匹配质量(距离)并排序,在一定置信度下显示前n匹配,以此得到哪两图是匹配的.

bf =cv2.BFMatcher(cv2.NORM_HAMMING , crossCheck=True)
matches = bf.match(des1,des2)
matcher = sorted(matches , key = lambda x : x.distance)

[2] - k-最近邻匹配

[3] - FLANN匹配:该机制可以根据数据本身选择最合适的算法来处理数据集. FLANN比其他近邻算法要快10倍

[4] - FLANN单应性匹配,单应性是一个条件,表明当两幅图像一幅出现投影畸变时,他们还能彼此匹配.

等等.

Last modification:December 29th, 2020 at 05:11 pm