opencv 特征点提取算法 SIFT SURF ORB FAST LBP学习

用opencv的traincascade.exe训练行人的HAAR、LBP和HOG特征的xml

特征点:
又称兴趣点、关键点,它是图像中突出且具有代表意义的一些点,通过这些点我们可以用来表征、识别图像、进行图像配准、进行3D重建等
旋转不变性和尺度不变性
角点:
最直观的印象就是在水平、竖直两个方向上变化均较大的点,即Ix、Iy都较大,角点的具体描述有几种:
一阶导数(即灰度的梯度)的局部最大所对应的像素点;
两条及两条以上边缘的交点;
图像中梯度值和梯度方向的变化速率都很高的点;
角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向
边缘:仅在水平、或者仅在竖直方向有较大的变化量,即Ix和Iy只有其一较大

Harris角点检测算法就是对角点响应函数R进行阈值处理:R > threshold,即提取R的局部极大值

SIFT
尺度不变特征变换算法,特征点的主方向是由梯度直方图的最大值和次大值所在的bin对应的方向决定的
优点:
1)SIFT特征具有旋转、尺度、平移、视角及亮度不变性,有利于对目标特征信息进行有效表达。
2)SIFT特征对参数调整鲁棒性好,在进行特征描述时,根据场景需要可调整适宜的特征点数量,以便进行特征分析。
SIFT特征算法对图像局部特征点的提取主要包括4个步骤:
疑似特征点检测、
去除伪特征点、
特征点梯度与方向匹配
特征描述向量生成:
特征描述通常是指把图像中的特征点的特征生成向量的过程。
每个SIFT特征包含128维特征,结构为16×8=128

SURF
Speeded Up Robust Features SURF算子是对SIFT的改进,比SIFT效率要高,类似于SIFT特征的一种尺度不变的特征点。
SURF主要是把SIFT中的某些运算作了简化。SURF把SIFT中的高斯二阶微分的模板进行了简化,使得卷积平滑操作仅需要转换成加减运算,这样使得SURF算法的鲁棒性好且时间复杂度低。SURF最终成生的特征点特征向量的维度为64维。
SURF最大的特征在于采用了harr特征以及积分图像的概念,这大大加快了程序的运行时间。

BRIEF
Binary Robust Independent Elementary Features,在特征点附近随机选取若干点对,将这些点对的灰度值的大小,
组合成一个二进制串,并将这个二进制串作为该特征点的特征描述子(即BRIEF描述子中的每一位是由随机选取的两个像素点做二进制比较得来,BRIEF描述子的所有编码都是二进制数的)
BRIEF的优点在于速度,缺点也相当明显:
1:不具备旋转不变性。
2:对噪声敏感
3:不具备尺度不变性。

ORB
ORiented Brief,特征点的主方向是通过矩(moment)计算而来,ORB是sift的100倍,是surf的10倍
Orient brief ORB特征基于FAST角点的特征点检测与描述技术,运行时间远优于SIFT与SURF,可用于实时性特征检测。
ORB特征具有尺度与旋转不变性,同时对噪声及透视仿射也具有不变性

FAST角点定义:
若某像素点与其周围领域内足够多的像素点处于不同的区域,则该像素点可能为角点
(考虑灰度图像,即若该点的灰度值比其周围领域内足够多的像素点的灰度值大或者小,则该点可能为角点)

FAST
Features From Accelerated SegmentTest
FAST是比较快速的特征点检测方法,只利用周围像素比较的信息就可以得到特征点,比其他已知的角点检测算法要快很多
FAST不产生多尺度特征而且FAST特征点没有方向信息,这样就会失去旋转不变性

Shi-Tomasi算法
Shi-Tomasi算法是Harris 算法的改进。Harris 算法最原始的定义是将矩阵 M 的行列式值与 M 的迹相减,再将差值同预先给定的阈值进行比较。
后来Shi 和Tomasi 提出改进的方法,若两个特征值中较小的一个大于最小阈值,则会得到强角点

class CV_EXPORTS_W FastFeatureDetector : public FeatureDetector {
public:
    enum{ // Define it in old class to simplify migration to 2.5
      TYPE_5_8 = 0, TYPE_7_12 = 1, TYPE_9_16 = 2
    };
    CV_WRAP FastFeatureDetector( int threshold=10, bool nonmaxSuppression=true );
    AlgorithmInfo* info() const;
protected:
    virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
    int threshold;
    bool nonmaxSuppression;
};

//! computes Harris cornerness criteria at each image pixel
CV_EXPORTS_W void cornerHarris( InputArray src, OutputArray dst, int blockSize,
                                int ksize, double k,
                                int borderType=BORDER_DEFAULT );

src输入图像
dst输出图像,输入是一个灰度图像,输出是一个浮点图像,
blockSize
指定角点分析的邻域,
ksize
实际上在角点求取过程中计算梯度图像的核窗口大小,
k 一个系数
borderType 边框类型

//! finds the strong enough corners where the cornerMinEigenVal() or cornerHarris() report the local maxima
CV_EXPORTS_W void goodFeaturesToTrack( InputArray image, OutputArray corners,
                                     int maxCorners, double qualityLevel, double minDistance,
                                     InputArray mask=noArray(), int blockSize=3,
                                     bool useHarrisDetector=false, double k=0.04 );

进行角点检测
image
要进行检测的图像,须为8位或32位单通道图像
corners
存储检测到的角点坐标,Point2f类型
maxCorners
检测到的角点的最大数目
qualityLevel
角点的阈值条件,即角点的质量等级:qualityLevel*max(min(e1,e2))
minDistance
容忍距离,单位像素
mask
一幅像素值为bool类型的图像,用于指定输入图像中参与角点计算的像素点。如果mask为NULL,则选择整个图像
blockSize
计算导数的自相关矩阵时指定的邻域
useHarrisDetector
是否使用Harris检测器Shi-Tomasi
k
一个系数,cornerHarris中的K

LBP
Local Binary Pattern 局部二值模式,是一种描述图像局部纹理的特征算子,可应用于图像特征分析,如:人脸识别、表情识别、行人检测领域
LBP特征描述的是一种灰度范围内的图像处理操作技术,针对的是输入源为8位或16位的灰度图像。
LBP牲征将窗口中心点与邻域点的关系进行比较,重新编码形成新特征以消除对外界场景对图像的影响,一定程度上解决了复杂场景下(光照变换)特征描述问题。
LBP特征具有旋转不变性与灰度不变性等优点。

LBP算法根据窗口领域的不同分为:
经曲LBP
经典LBP的算子窗口为3×3的正方形窗口,以窗口中心像素为阈值,将其相邻8领域像素灰度与中心像素值比较,若中心像素值小于周围像素值,则该中心像素位置被标记为1,否则为0
圆形LBP
采样点在圆形边界上

对LBP特征向量进行提取的步骤
1)首先将检测窗口划分为16×16的小区域(cell);
2)对于每个cell中的一个像素,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该 像素点的位置被标记为1,否则为0。这样3*3邻域内的8个点经比较可产生8位二进制数,即得到该窗口中心像素点的LBP值;
3)计算每个cell的直方图,即每个数字(假定是十进制数LBP值)出现的频率;然后对该直方图进行归一化处理
4)最后将得到的每个cell的统计直方图进行连接成为一个特征向量,也就是整幅图的LBP纹理特征向量;
然后便可利用SVM或者其他机器学习算法进行分类了

圆形LBP算子
LBP旋转不变模式
LBP等价模式:
等价模式类
混合模式类

LBP的应用中,如纹理分类、人脸分析等,一般都不将LBP图谱作为特征向量用于分类识别,而是采用LBP特征谱的统计直方图作为特征向量用于分类识别

HOG
Histogram of Oriented Gradient HOG 方向梯度直方图, 常应用于目标物体检测与特征分析,HOG特征描述在行人检测算法中性能表现优秀,结合SVM分类技术已广泛应用在图像识别与分析领域。
HOG是通过计算和统计图像局部区域的梯度方向直方图来实现特征描述的。

图像梯度方向直方图将图像划分成小部分连通区域,对这些划分出来的细胞单元各个像素点进行梯度方向的的直方图描述,最后级合成相应的特征描述器。梯度方向

HOG特征提取算法实现过程:
HOG特征提取方法就是将一个image(你要检测的目标或者扫描窗口):
1)图像灰度化;
2)采用Gamma校正法对输入图像进行颜色空间的标准化(归一化),目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;
3)计算图像每个像素的梯度(包括大小和方向),主要是为了捕获轮廓信息,同时进一步弱化光照的干扰。
4)将图像划分成小cells(例如6*6像素/cell);
5)统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的descriptor;
6)将每几个cell组成一个block(例如3*3个cell/block),一个block内所有cell的特征descriptor串联起来得到该block的HOG特征descriptor。
7)将图像image内的所有block的HOG特征descriptor串联起来就可以得到该image(你要检测的目标)的HOG特征descriptor了。这个就是最终的可供分类使用的特征向量了。

特征向量维数N,N = ((W–wb )/stride + 1)*((H-hb)/stride+1)*bins*n
其中W为图片的宽,H为图片的高,wb和hb为block的宽与高,stride为cell的大小,bins为投影的区块,n为一个block中包含的cell的个数

//HOG检测器,用来计算HOG描述子: HOG描述子的维数,由图片大小、检测窗口大小、块大小、细胞单元中直方图bin个数决定

CV_WRAP HOGDescriptor(Size _winSize, Size _blockSize, Size _blockStride,
                  Size _cellSize, int _nbins, int _derivAperture=1, double _winSigma=-1,
                  int _histogramNormType=HOGDescriptor::L2Hys,
                  double _L2HysThreshold=0.2, bool _gammaCorrection=false,
                  int _nlevels=HOGDescriptor::DEFAULT_NLEVELS)

Haar
特征分为三类:边缘特征(4种)、线性特征(8种)、中心特征(2种)和对角线特征(2种,Haar-like矩形特征库作了进一步扩展,加入了旋转45度),组合成特征模板。
特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和。
Haar特征值反映了图像的灰度变化情况

Haar-like特征的计算—积分图
积分图就是只遍历一次图像就可以求出图像中所有区域像素和的快速算法
积分图主要的思想:
是将图像从起点开始到各个点所形成的矩形区域像素之和作为一个数组的元素保存在内存中,当要计算某个区域的像素和时可以直接索引数组的元素,不用重新计算这个区域的像素和,从而加快了计算(也叫做动态规划算法)

特征值的计算过程中,黑色区域的权值为负值,白色区域的权值为正值。而且权值与矩形面积成反比(使两种矩形区域中像素数目一致);