前言概述
打算用几篇文章回顾OpenCV特征模块(features2d)当中的对象检测(object detection)概念,以及主要的经典算法。这些传统的算法相对于现在来讲,可能有些过时,但对于初学者来说还是有必要学学的。了解掌握什么是图像特征,常见的图像特征,有哪些提取方法,这些特征能做些什么?有哪些应用场景?
1、什么是图像特征?可以表达图像中对象的主要信息、并且以此为依据可以从其他未知图像中检测出相似或者相同的对象。最常见的应用场景就是人脸检测/人脸识别,
2、场景的图像特征包含:角点、边缘、纹理。我们也是从这三个特征点,基于OpenCV的feature2d已有的API去分析。
3、图像特征的描述,包括以下主要的特征提取方法:SIFT、SURF、HOG、Haar、OBR、FLANN、LBP、AKAZE、BRISK等等,
4、图像特征的应用场景,经典的就是以图搜图、全景图像拼接。最广泛的实用场景有:人脸检测、物体识别、车牌识别、OCR等等广泛的智能应用。
初识特征
想象一下拿图片所有像素去进行搜索,如果对其中的所有信息都进行比较的话,那是非常困难、非常耗时、非常耗存储空间。实际上的做法就是把目标图像的一些特征点提取出来,提取出来的特征可能只有几个字节,然后再用这些特征去搜索就非常的方便且快速了。再简单描述下人脸检测,也是通过提取人脸的特征,譬如眼角、嘴唇边缘、鼻孔纹理等一些特征信息,去定位检索人脸所在的区域。
我们来看一个具体的例子,如上图所示,我们从图中任意区域检索出六张子图。AB/CD/EF各一组,对应纹理、边缘、角点三种特征。
- 先观察第一组A和B,通过纹理特征是否能知道它在原图的具体哪个位置?目前来看,这是很难准确的定位到AB在原图的哪个位置上,因为原图有很多地方是包含类似的特征信息。在二维平坦的图像来说,它没有明显的特征,也不是唯一的,所以单靠纹理这种特征是很难识别出来的。
- 再来看第二组C和D,通过其边缘的特征,我们可以基本确定是在屋顶这一片区域,但是还是无法确切的知道它是在屋顶的具体哪个位置。
- 最后看第三组E和F,这一组是两个边角的特征,这时候我们就容易识别出它两在原图的哪个位置上,就是左边第一栋建筑楼顶上。
通过上面的一个简单案例的分析,我们试着总结以下规律:
- 图像特征就是指有意义的图像区域,具有独特性,易于识别,比如角点斑点,边缘轮廓,以及高密度区域。
- 在三大类特征中:角点的特征足够明显,边缘轮廓次之,平坦的纹理就无法确认其细节了。
- 寻找特征的简易方法:首先特征最好是唯一的,而且必须是可追踪可量化的,最后就是这些特征是可以比较的,如果不能比较,那么是不可能在目标图像上寻找到相同or类似的位置或者是描述。
聚焦特征
一般的图像特征提取,我们都聚焦到角点特征上,因为角点特征足够明显。那么对于计算机视觉来说,什么是角点呢?可以简单概述为 灰度的梯度最大值 对应的像素区域。图像灰度是具有阶梯性的,从白到灰依次递进,对应灰度求梯度所对应的最大值的点位置,我们可以定性为其角点特征。另外呢,两条边缘线的交点基本也是确认为一个角点;还有灰度的极值点也是可以确定为角点特征,用数学语言描述就是一阶导数最大值&二阶导数为0(对应Jacobian矩阵 和 Hessian矩阵)。以上这些的条件,对于我们人类来说是不够清晰而且难于描述,但是对于计算机来说,这些都是可量化可理解的。
理解到什么是图像特征之后,那么图像特征有什么作用呢?在传统图像处理中,利用图像的特征进行匹配,进而识别图像中的内容,一般要遵循三个基本步骤,这三步骤统称Feature DDM:
- 特征检测提取Detection,特征提取就是从图像中提取出关键点(或特征点、角点)等。
- 特征描述Description,特征描述就是用一组数学向量对特征点进行描述,其主要保证不同的向量和不同的特征点之间是一种对应的关系,同时相似的关键点之间的差异尽可能小。
- 特征匹配Match,特征匹配其实就是特征向量之间的距离计算,常用的距离有欧氏距离、汉明距离、余弦距离等。
以上内容主要介绍了什么是图像特征,能应用于哪些场景,特征在计算机中是如何定义等一系列概念知识。也了解到通过角点特征,我们立马就可以判断当前特征对应的区域,是否在于原始图像中。后面的文章也是按照Feature DDM去深入展开,了解OpenCV给我们提供了哪些API,学习如何实用这些API以及其背后的基本原理。