图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601
什么叫特征检测?就是检测图像中目标的特征呗,所谓特征,不管你怎么旋转目标,离目标远近,它的特征都应不变才对,这两个特性称为叫旋转不变性和尺度不变性。当然还有其它特征,如光照不一样,也不应该变化嘛,只是旋转不变性和尺度不变性是最基本的两个要求。
对特征的描述有很多种方法和算子,常见的有SIFT特征描述算子、SURF特征描述算子、ORB特征描述算子、HOG特征描述、LBP特征描述以及Harr特征描述。本文先介绍SIFT特征描述算子、SURF特征描述算子、ORB特征描述算子、HOG特征描述、LBP特征描述的原理及OpenCV代码袜现,当然我只能大概介绍,如果要了解详细原理,请查看相应的论文及资料。
一、SIFT特征描述算子
SIFT是目前应用最广泛的关键点检测和描述算法(PS:具体是不是这样,博主也不清楚,只是资料上是这么写得,因为它的算法复杂度是很高的?这样也能用最字来描述么?那你让后面我要提到的ORB特征描述怎么想?),SITFT算法首先被David.G.Lowe提出并发表在文章“Distinctive Image Features from Scale-Invariant Keypoints”中,其中Scale-Invariant的意思是尺度不变性,尺度不变性的概念我在本博文的第一段已经叙述了。SIFT特征提取充分利用了图像局部信息,它包含以下优点:
⑴SIFT特征具有旋转、尺度、平移、视角及亮度不变性,有利于对目标特征信息进行有效表达。
⑵SIFT特征对参数调整鲁棒性好,在进行特征描述时,根据场景需要可调整适宜的特征点数量,以便进行特征分析。
SIFT特征算法对图像局部特征点的提取主要包括4个步骤:疑似特征点检测、去除伪特征点、特征点梯度与方向匹配及特征描述向量生成。
SITF的缺点是如果不借助硬件加速或专门的图像处理器很难达到实现。
步骤1-疑似特征点检测
特征点在某些情况下是图像中的角点,然而由于SIFT特征需要特征点包含尺度及方向,因此需要建立相应的图像尺度空间,高斯函数是唯一可以产生尺度空间的核因子。让图像与高斯函数卷积可以实现多尺度操作(你可以联想前面介绍的图像缩放中的高斯金字塔来理解这一点)。对原始特征点作进一步过滤时不被滤掉的条件是:该点需要满足上下尺度平面集在进行差分高斯操作时对应的26个点中的极值,26个点分别是上平面对应的9个检测点,待检测平面邻域点8个,下平面对应的9个检测点。(PS:不需要完全看懂判断条件,因为你不懂原理是不可能看懂的)
步骤2-去除伪特征点
上一步骤得到的疑似特征点,高斯差分算子对边缘及噪声相对敏感,会产生伪边缘信息和伪极值响应信息。可以通过分析高斯差分算子的特性来去除因上述原因造成的伪特征点。具体怎么分析,我这里就不作介绍了,有需要了解的可以去查阅相关论文和资料。
步骤3-特征点梯度及方向分配
通过前面两步只实现了图像尺度不变性的特征提取,在这一部实现旋转不变性特征的提取。具体的计算方法我这里就不多说了,因为不是一两句话能说清楚的,没有学习过算法本身的话根本是理解不到的,所以大家如果要知道还不如去看算法提出的论文。
步骤4-特征描述:特征向量生成
特征描述通常是指把图像中的特征点的特征生成向量的过程。每个SIFT特征包含128维特征。具体这128维特征的结构为16×8=128
OpenCV提供了类SiftFeatureDetector和SiftDescriptorExtractor来实现SIFT特征检测,具体怎么用,大家一看代码就知道了,这里就不再叙述了。值得注意的是,SIFT和下面要介绍的SURF的源代码都在OpenCV的nonfree模块中,意思是这是有知识版权保护的算法,如果要使用,可能要向原作者给版权费哦,在OpenCV的3.0.0版中,还没有SIFT和SURF算法,所以我只好换回到了2.4.13版,实现代码如下:
代码中用到的图像的下载链接为hand1.jpg_免费高速下载|百度网盘-分享无限制:
代码请访问博文0046-OpenCV下的SIFT特征检测_清溪算法-CSDN博客获取
代码请访问博文0046-OpenCV下的SIFT特征检测_清溪算法-CSDN博客获取
代码请访问博文0046-OpenCV下的SIFT特征检测_清溪算法-CSDN博客获取
运行结果如下图所示:
二、SURF特征描述算子
前面提到SITF的缺点是如果不借助硬件加速或专门的图像处理器很难达到实现,所以人们就要想办法对SITF算子进行改进,SURF算子便是对SIFT的改进,不过改进之后在算法的运行时间上还是没有质的飞跃,后文要介绍的ORB特征描述算子在运行时间上才是一种质的飞跃,后文会介绍ORB特征描述算子,说回来,这一部分咱们说SURF算子。
SURF特征描述子是Herbert Bay等人在2006年发表的论文“SURF:Speeded Up Robust Features”中提出的,正如我上一段所述,该算法对经典SIFT特征进行了改进,但是改进之后性能提升还是有限的。
SURF主要是把SIFT中的某些运算作了简化。SURF把SIFT中的高斯二阶微分的模板进行了简化,使得卷积平滑操作仅需要转换成加减运算,这样使得SURF算法的鲁棒性好且时间复杂度低。SURF最终成生的特征点特征向量的维度为64维。
OpenCV提供了类SurfFeatureDetector和SurfDescriptorExtractor来实现SURF特征检测,具体怎么用,大家一看代码就知道了,这里就不再叙述了。值得注意的是,SIFT和下面要介绍的SURF的源代码都在OpenCV的nonfree模块中,意思是这是有知识版权保护的算法,如果要使用,可能要向原作者给版权费哦,在OpenCV的3.0.0版中,还没有SIFT和SURF算法,所以我只好换回到了2.4.13版,实现代码如下:
代码中用到的图像的下载链接为hand1.jpg_免费高速下载|百度网盘-分享无限制:
代码请访问博文0047-OpenCV下的SURF特征检测_清溪算法-CSDN博客获取
代码请访问博文0047-OpenCV下的SURF特征检测_清溪算法-CSDN博客获取
代码请访问博文0047-OpenCV下的SURF特征检测_清溪算法-CSDN博客获取
运行结果如下图所示:
三、ORB特征描述
ORB特征描述算法的运行时间远优于SIFT与SURF,可用于实时性特征检测。ORB特征基于FAST角点的特征点检测与描述技术,该算法是Ethan Rubleed 在论文“ORB:An efficient alternative to SIFT or SURF”中提出的。ORB特征具有尺度与旋转不变性,同时对噪声及透视仿射也具有不变性,良好的性能使得得用ORB在进行特征描述时的应用场景十分广泛。
ORB特征检测主要分为以下两个步骤。
步骤①方向FAST特征点检测
FAST角点检测是一种基于机器学习的快速角点特征检测算法,具有方向的FAST特征点检测是对兴趣点所在圆周上的16个像素点进行判断,若判断后的当前中心像素点为暗或亮,将瘊定其是否为角点。前面我已经写了一篇博文(moravec、harris、Shi-Tomasi角点检测的简介及OpenCV代码实现)介绍角点检测的常用方法,FAST角点检测相对于这些方法来说,计算的时间复杂度小,检测效果突出。FAST角点检测为加速算法实现,通常先对回周上的点集进行排序,排序使得其计算过程大大得到了优化。FAST对多尺度特性的描述是还是通过建立图像金字塔实现的,而对于旋转不变性即方向的特征则引入灰度质心法用于描述特征点的方向。
步骤②BRIEF特征描述
BRIEF描述子主要是通过随机选取兴趣点周围区域的若干点来组成小兴趣区域,将这些小兴趣区域的灰度二值化并解析成二进制码串,将串特征作为该特征点的描述子,BRIEF描述子选取关键点附近的区域并对每一位比较其强度大小,然后根据图像块中两个二进制点来判断当前关键点编码是0还是1.因为BRIEF描述子的所有编码都是二进制数的,这样就节省了计算机存储空间。
OpenCV提供了类ORB来实现ORB特征检测,代码如下:
代码中用到的图像的下载链接为hand1.jpg_免费高速下载|百度网盘-分享无限制:
代码请访问博文0048-OpenCV下的ORB特征检测_清溪算法-CSDN博客获取
代码请访问博文0048-OpenCV下的ORB特征检测_清溪算法-CSDN博客获取
代码请访问博文0048-OpenCV下的ORB特征检测_清溪算法-CSDN博客获取
代码运行结果如下图所示:
四、方向梯度直方图HOG
方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是Dalal于2005年针对行人检测问题提出的直方图特征,常应用于目标物体检测与特征分析,HOG特征描述在行人检测算法中性能表现优秀,结合SVM分类技术已广泛应用在图像识别与分析领域。HOG是通过计算和统计图像局部区域的梯度方向直方图来实现特征描述的。至于有没有旋转不变性和尺度不变性,博主暂且不知。
图像梯度方向直方图将图像划分成小部分连通区域,对这些划分出来的细胞单元各个像素点进行梯度方向的的直方图描述,最后级合成相应的特征描述器。梯度方向直方图特征提取步骤如下:
①归一化处理。归一化操作是为了提高图像特征描述对光照及环境变化的鲁棒性,降低图像局部的阴影、局部曝光过多及纹理失真,尽可能抵制噪声干扰。归一化处理操作是先将图像转换为灰度图像,再利用伽马校正实现。
②计算图像梯度。
③统计梯度方向。
④特征向量归一化。为克服光照不均匀变化及前景与背景的对比差异,需要对块内的特征向量进行归一化处理。
⑤生成特征向量。
OpenCV中提供了专门用于HOG特征检测的类HOGDescriptor,该类提供了多种成员函数方法,HOGDesciptor方法完成HOG初始化参数,行人检测默认参数实现方法getDefaultPeopleDetector,目标单尺度检测方法是detect,目标多尺度检测方法是detectMultiScale。在这篇博文中,不用OpenCV提供的这个现成的类实现HOG实现检测,等会儿贴出的代码是用户自己写的代码,以后有空再上使用类HOGDescriptor实现HOG检测的代码。下面说下等儿贴出的代码的实现思路(PS:思路只是作个大概描述,如果真要看懂,还是要先把原理搞清楚的)。
步骤① 在进行HOG特征描述实现时,需要完成对积分图的计算。首先对源图像进行水平与竖直方向的Sobel边缘检测;初始化直方图bins,将Sobel检测结果利用cartToPolar进行坐标转换,再将对应的矩阵角度进行分段变换;然后遍历图像,计算对应角度下的bins幅值,进而生成对应的区域积分图。这部分在代码中对应的函数名为CalculateIntegralHOG.
步骤② HOG特征计算。传统HOG特征计算的时间复杂度较高,在实际进行特征描述时一般采用积分直方图来代替,像素点(x,y)积分直方图为梯度图像中满足矩形区域所有像素点的梯度方向直方图。这部分在代码中对应的函数名为cacHOGinCell.
步骤③ 利用前面两步的结果生成相应的方向梯度直方图牲,绘制HOG特征图。
HOG特征提取算法流程如下图所示:
HOG特征计算实现代码如下(代码中用到的图像下载链接为hand1.jpg_免费高速下载|百度网盘-分享无限制):
代码请访问博文0049-利用OpenCV的HOG类进行行人区域的检测_清溪算法-CSDN博客获取
代码请访问博文0049-利用OpenCV的HOG类进行行人区域的检测_清溪算法-CSDN博客获取
代码请访问博文0049-利用OpenCV的HOG类进行行人区域的检测_清溪算法-CSDN博客获取
运行结果如下图所示:
五、局部二值模式LBP
LBP(Local Binary Pattern),局部二值模式是一种描述图像局部纹理的特征算子,该算子是由T.Ojala等人于1994年首次提出的,后经过发展改进可应用于图像特征分析,该算子具有旋转不变性与灰度不变性等显著优点。LBP特征描述的是一种灰度范围内的图像处理操作技术,针对的是输入源为8位或16位的灰度图像。LBP特征是高效的图像特征分析方法,经过改进与发展已经应用于多个领域之中,特别是人脸识别、表情识别、行人检测领域已经取得了成功。LBP牲征将窗口中心点与邻域点的关系进行比较,重新编码形成新特征以消除对外界场景对图像的影响,因此一定程度上解决了复杂场景下(光照变换)特征描述问题。
LBP算法根据窗口领域的不同分为经曲LBP和圆形LBP两种。下面分别介绍:
①经典LBP
经典LBP的算子窗口为3×3的正方形窗口,以窗口中心像素为阈值,将其相邻8领域像素灰度与中心像素值比较,若中心像素值小于周围像素值,则该中心像素位置被标记为1,否则为0(显然这种规则下,对于中心点大于或等于这两种情况,算法无法区分,后续经过改进引入LBP+与LBP-因子用来区分这两种情况)。图像经过这种遍历操作后,图像就被二值化了,每一个窗口中心的8邻域点都可以由8位二进制数来表示,即可产生256种LBP码,这个LBP码值可以用来反映窗口的区域纹理信息。LBP具体在生成的过程中,先将愿意图像划分为若干个子区域,子区域窗口可根据原图像的尺寸进行调整,而不一定非得为3×3的正方形窗口。一般对于512×640的图像,子区域窗口区域选取大小为16×16.
②圆形LBP
经典LBP用正方形8-领域来描述图像的纹理特征,其缺点是难以满足不同尺寸和频率的需求。Ojala等人对经典LBP进行了改进,提出了将3×3的正方形窗口领域扩展到任意圆形领域。由于圆形LBP采样点在圆形边界上,那么必然会导致部分计算出来的采样点坐标不是整数,因此这里就需要对得到的坐标像素点值进行处理,常用的处理方法是最近邻插值或双线性插值。
OpenCV中提供了模板类LBP来实现LBP算法,LBP的相关操作存放在facerec.cpp中。这里我们不使用LBP类来实现LBP算法,因为经典LBP算法实现起来很简单,于是自己写代码,以后有缘再补充使用OpenCV的LBP类来实现LBP算法的代码。
经典LBP的实现代码如下:
代码中用到的图像下载链接为hand1.jpg_免费高速下载|百度网盘-分享无限制
代码请访问博文0050-OpenCV下的LBP特征检测_清溪算法-CSDN博客获取
代码请访问博文0050-OpenCV下的LBP特征检测_清溪算法-CSDN博客获取
代码请访问博文0050-OpenCV下的LBP特征检测_清溪算法-CSDN博客获取
运行结果如下图所示:
图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601