图像特征提取

图像特征提取:hough变换、harris角点、sift算子、orb算子

特征描述

简单描述

区域的基本特征包括面积、质心、圆形性等

  • 区域面积:区域包含的像素数
  • 区域重心:图像中心
  • 形状参数: \(F=\frac{||B||^2}{4\pi A}\),圆形F=1 其他F>1
  • 偏心率:等效椭圆宽高比
  • 欧拉数:E=C-H
  • 圆形性

一般性描述

最小包围矩形和多边形拟合能有效的描述区域形状 20220521180317

方向和离心率,多边形拟合 20220521180417

归一化中心矩

图像\(f(x,y)\)\(p+q\)阶矩定义为: \[ m_{pq}=\sum_{(x_i,y_i)\in R}x_i^py_i^qf(x_i,y_i) \] \(f(x,y)\)\(p+q\)阶中心矩定义为: \[ \mu_{pq}=\sum_{(x_i,y_i)\in R}(x-\bar x)^p(y-\bar y)^qf(x_i,y_i) \] 其中\(\bar x=\frac{m_{10}}{m_(00)},\bar y=\frac{m_{01}}{m_(00)}\),即重心

\(f(x,y)\)的归一化中心距定义为: \[ \begin{split} \eta_{pq}&=\frac{\mu_{pq}}{\mu_{00}^\gamma}\\ \gamma &= \frac{p+q}{2}+1,p+q\geq 2 \end{split} \]

七个不变矩

常用的有七个不变矩,即对平移、旋转和尺度变化保持不变。这些可由归一化的二阶和三阶中心矩得到. 七个不变矩特征可以有效的度量区域形状,对平移、旋转和比例放缩变换不敏感

\[ \begin{split} \phi_1&=\eta_{20}+\eta_{02}\\ \phi_2&=(\eta_{20}-\eta_{02})^2+4\eta_{11}^2\\ \phi_3&=(\eta_{30}-3\eta_{12})^2+(3\eta_{21}-\eta_{03})^2\\ \phi_4&=(\eta_{30}+\eta_{12})^2+(\eta_{21}+\eta_{03})^2\\ \end{split} \]

直线检测

霍夫变换常用于检测直线,即在二值图像中寻找直线,经过扩展也可以检测圆和其他简单的形状结构。霍夫变换检测直线与圆相比其它方法可以更好的减少噪声干扰。 可以用于条形码的扫描、验证和识别。

参数空间变换

原始图像坐标系下点B,经过点B的一条直线,对应参数坐标系中的一个\((\rho,\theta)\) 20220521181105

经过点B的无数条直线,对应无数个(\(\rho,\theta\)) 20220521184422

20220521184453

参数坐标系下多条曲线的交点,表示原始坐标系下共线的多个点,也就是直线 20220521184526

  • 为了检测出直角坐标X-Y中由点所构成的直线,可以将极坐标a-p量化成许多小格
  • 根据直角坐标中每个点的坐标(x,y),在a = 0-180°内以小格的步长计算各个p值,所得值落在某个小格内,便使该小格的累加记数器加1
  • 当直角坐标中全部的点都变换后,对小格进行检验,计数值最大的小格,其(a,p)值对应于直角坐标中所求直线

openCV实现

#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
Mat src, dst, color_dst;
if( argc != 2 || !(src=imread(argv[1], 0)).data)
return -1;

Canny( src, dst, 50, 200, 3 );
cvtColor( dst, color_dst, COLOR_GRAY2BGR );
vector<Vec4i> lines;
HoughLinesP( dst, lines, 1, CV_PI/180, 80, 30, 10 );
for( size_t i = 0; i < lines.size(); i++ )
{
line( color_dst, Point(lines[i][0], lines[i][1]),
Point(lines[i][2], lines[i][3]), Scalar(0,0,255), 3, 8 );
}
namedWindow( "Source", 1 );
imshow( "Source", src );

namedWindow( "Detected Lines", 1 );
imshow( "Detected Lines", color_dst );

waitKey(0);
return 0;
}
void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta,
int threshold, double minLineLength=0, double maxLineGap=0 )
  • 第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的单通道二进制图像,可以将任意的源图载入进来后由函数修改成此格式后,再填在这里。
  • 第二个参数,InputArray类型的lines,经过调用HoughLinesP函数后后存储了检测到的线条的输出矢量,每一条线由具有四个元素的矢量 表示,其中 和 是每个检测到的线段的结束点。
  • 第三个参数,double类型的rho, 以像素为单位的距离精度。 另一种形容方式是直线搜索时的进步尺寸的单位半径。
  • 第四个参数,double类型的theta,以弧度为单位的角度精度。另一种形容方式是直线搜索时的进步尺寸的单位角度。
  • 第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。 大于阈值 threshold 的线段才可以被检测通过并返回到结果中。
  • 第六个参数,double类型的minLineLength,有默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。
  • 第七个参数,double类型的maxLineGap,有默认值0,允许将同一行点与点之间连接起来的最大的距离。

Harris角点检测

定义和基本原理

  • Harris算子是Harris和Stephens在1998年提出的一种基于信号的点特征提取算子。其前身是Moravec算子。
  • 在图像中设计一个局部检测窗口,当该窗口沿各个方向做微小移动时,考察窗口的平均能量变化.
  • 在灰度变化平缓区域,窗口内像素灰度积分近似保持不变
  • 在边缘区域,边缘方向:灰度积分近似不变,其余任意方向:剧烈变化
  • 在角点处,任意方向移动,窗口灰度值均剧烈变化

20220521184720

灰度积分变化

定义灰度积分变化: \[ E(u,v)=\sum_{x,y}w(x,y)[I(x+u,y+v)-I(x,y)]^2 \] 如果\(u,v\)很小,则有: \[ \begin{split} E(u,v)&\approx\begin{bmatrix} u&v \end{bmatrix}M\begin{bmatrix} u\\ v \end{bmatrix} \\ M&=\sum_{x,y}w(x,y)\begin{bmatrix} I_x^2&I_xI_y\\ I_xI_y&I_y^2 \end{bmatrix} \end{split} \]

20220521194011

\(\lambda_1^{-1/2}\)\(\lambda_2^{-1/2}\)是椭圆的长短轴 当\(\lambda_1,\lambda_2\)都比较小时,点\((x,y)\)处于灰度变化平缓区域 当\(\lambda_1\gg\lambda_2\)或者\(\lambda_1\ll\lambda_2\)时,点\((x,y)\)为边界像素 当\(\lambda_1,\lambda_2\)都比较大,且近似相等时,点\((x,y)\)为角点

20220521201626

角点响应函数

\[ \begin{split} R&=\det M-k(\text{trace} M)^2\\ \text{trace} M&=\lambda_1+\lambda_2\\ \det M&=\lambda_1\lambda_2 \end{split} \]

  • 当R接近于零时,处于灰度变化平缓区域;
  • 当R<0时,点为边界像素;
  • 当R>0时,点为角点。 所以,引入角点响应函数的意义是由于λ1、λ2的大小是相对而言的,无法量化进行判断,所以引入角点响应函数,方便判断该点是否是角点

openCV函数

CV_EXPORTS_W void cornerHarris( InputArray src, OutputArray dst, int blockSize,
int ksize, double k,
int borderType = BORDER_DEFAULT );
  • src,输入图像,即源图像,填Mat类的对象即可,且需为单通道8位或者浮点型图像。
  • dst,函数调用后的运算结果存在这里,即这个参数用于存放Harris角点检测的输出结果,和源图片有一样的尺寸和类型。
  • blockSize,表示邻域的大小,更多的详细信息在cornerEigenValsAndVecs中有讲到。
  • ksize,表示Sobel()算子的孔径大小。
  • k,Harris参数。
  • borderType,图像像素的边界模式,注意它有默认值BORDER_DEFAULT。更详细的解释,参考borderInterpolate函数

SIFT角点检测

  • SIFT的全称是Scale Invariant Feature Transform(尺度不变特征变换),是由加拿大教授David G.Lowe在1999年在会议文章中提出,2004年发表在IJCV上。是计算机视觉界近二十年来引用率最高的文章之一
  • 图像的局部特征,对旋转、尺度缩放、亮度变化保持不变,对视角变化、仿射变换、噪声也保持一定程度的稳定性。
  • 独特性好,信息量丰富,适用于海量特征库进行快速、准确的匹配。
  • 多量性:即使是很少几个物体也可以产生大量的SIFT特征
  • 高速性:改进的SIFT匹配算法甚至可以达到实时性
  • 扩展性:可以很方便的与其他的特征向量进行联合。
  • SIFT在图像的不变特征提取方面拥有无与伦比的优势,但并不完美,仍然存在:实时性差。有时特征点较少。对边缘光滑的目标无法准确提取特征点

尺度空间极值检测

  • 在图像信息处理模型中引入一个被视为尺度的参数,通过连续变化尺度参数获得多尺度下的尺度空间表示序列,对这些序列进行尺度空间主轮廓的提取,并以该主轮廓作为一种特征向量,实现边缘、角点检测和不同分辨率上的特征提取等。
  • 尺度空间方法将传统的单尺度图像信息处理技术纳入尺度不断变化的动态分析框架中,更容易获取图像的本质特征。尺度空间中各尺度图像的模糊程度逐渐变大,能够模拟人在距离目标由近到远时目标在视网膜上的形成过程
  • 尺度空间在实现时使用高斯金字塔表示,高斯金字塔的构建分为两部分:对图像做不同尺度的高斯模糊;对图像做降采样(隔点采样)。
  • 图像的金字塔模型是指,将原始图像不断降阶采样,得到一系列大小不一的图像,由大到小,从下到上构成的塔状模型。搜索所有尺度上的图像位置,通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。

关键点定位和方向确定

20220521203347

  • 尺度归一化的高斯拉普拉斯函数的极大值和极小值能够产生最稳定的图像特征
  • 在实际计算时,使用高斯金字塔每组中相邻上下两层图像相减,得到高斯差分图像,如图所示,进行极值检测。这样就能得到候选的sift特征点。

20220521203721

  • 基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。使用图像梯度的方法求取局部结构的稳定方向。
  • 对于在DOG金字塔中检测出的关键点,采集其所在高斯金字塔图像3σ邻域窗口内像素的梯度和方向分布特征。
  • 将梯度方向直方图中纵坐标最大的项代表的方向分配给当前关键点作为主方向,若在梯度直方图中存在一个相当于主峰值80%能量的峰值,则将这个方向认为是关键点的辅方向。
  • 辅方向的设计可以增强匹配的鲁棒性,Lowe指出,大概有15%的关键点具有辅方向,而恰恰是这15%的关键点对稳定匹配起到关键作用

20220521203746

所有后面对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。

关键点特征描述

  1. 确定计算描述子所需的图像区域。实际计算所需的图像区域半径为:radius=(3σ_oct×(d+1)×√2)/2

  2. 将坐标轴旋转为关键点的方向,以确保旋转不变性 \[ \begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} cos\theta & -sin\theta\\ sin\theta & cos\theta \end{bmatrix} \begin{bmatrix} x\\ y \end{bmatrix} \]

  3. SIFT描述子是关键点邻域高斯图像梯度统计结果的一种表示。通过对关键点周围图像区域分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象,具有唯一性。

  4. 在图像半径区域内对每个像素点求其梯度幅值和方向,然后对每个梯度幅值乘以高斯权重参数,生成方向直方图

  5. Lowe实验表明描述子采用在关键点尺度空间内44的窗口中计算的8个方向的梯度信息,共44*8=128维向量表征,综合效果最优。

  6. 描述子向量元素门限化以及门限化后的描述子向量规范化。至此,SIFT特征描述向量生成

ORB角点检测

  • ORB(Oriented FAST and Rotated BRIEF)是一种快速特征点提取和描述的算法。

  • ORB算法分为两部分,分别是特征点提取和特征点描述。

  • 特征提取是由FAST(Features from Accelerated Segment Test)算法发展来的,特征点描述是根据BRIEF(Binary Robust Independent Elementary Features)特征描述算法改进的。

  • ORB = oFast + rBRIEF。据称ORB算法的速度是sift的100倍,是surf的10倍。

  • oFAST是一类快速角点检测算法,并具备旋转不变性

  • rBRIEF是一类角点描述(编码算法),并且编码具有良好的可区分性

OFAST提取特征点

  • 从图像中选取一点P,以P为圆心画一个半径为3像素的圆。圆周上如果有连续N个像素点的灰度值比P点的灰度值大或小,则认为P为特征点。这就是大家经常说的FAST-N。有FAST-9、FAST-10、FAST-11、FAST-12,大家使用比较多的是FAST-9和FAST-12
  • 为了加快特征点的提取,快速排出非特征点,首先检测1、5、9、13位置上的灰度值,如果P是特征点,那么这四个位置上有3个或3个以上的的像素值都大于或者小于P点的灰度值。如果不满足,则直接排出此点
  • 机器学习的方法筛选最优特征点,使用ID3算法训练一个决策树,将特征点圆周上的16个像素输入决策树中,以此来筛选出最优的FAST特征点
  • 使用非极大值抑制算法去除临近位置多个特征点。计算特征点出的FAST得分值s(像素点与周围16个像素点差值的绝对值之和)。以特征点p为中心的一个邻域(如3x3或5x5)内,若有多个特征点,则判断每个特征点的s值。若p是邻域所有特征点中响应值最大的,则保留;否则,抑制。若邻域内只有一个特征点,则保留。
  • 建立金字塔以实现特征点多尺度不变性。设置一个比例因子scaleFactor(opencv默认为1.2)和金字塔的层数nlevels(Opencv默认为8)。将原图像按比例因子缩小成nlevels幅图像。缩放后的图像为:I’= I/scaleFactork(k=1,2,…, nlevels)。nlevels幅不同比例的图像提取特征点总和作为这幅图像的oFAST特征点
  • 通过矩来计算特征点以r为半径范围内的质心,特征点坐标到质心形成一个向量作为该特征点的方向。

rBRIEF特征描述

  • BRIEF算法计算出来的是一个二进制串的特征描述符。它是在一个特征点的邻域内,选择n对像素点pi、qi(i=1,2,…,n)。
  • 比较每个点对的灰度值的大小,如果I(pi)> I(qi),则生成二进制串中的1,否则为0。所有的点对都进行比较,则生成长度为n的二进制串。一般n取128、256或512,opencv默认为256

20220521203909

  • 在300k特征点的每个31x31邻域内按M种方法取点对,比较点对大小,形成一个300kxM的二进制矩阵Q。矩阵的每一列代表300k个点按某种取法得到的二进制数。
  • 对Q矩阵的每一列求取平均值,按照平均值到0.5的距离重新对Q矩阵的列向量排序,形成矩阵T。
  • 取T的下一列向量和R中的所有列向量计算相关性,如果相关系数小于设定的阈值,则将T中的该列向量移至R中。不断进行操作,直到R中的向量数量为256。通过这种方法就选取了这256种取点对的方法。这就是rBRIEF算法。