图像处理特征

2014-04-15 10:41:15 Angelahhj 阅读数 4641

图像特征的分类有多种标准,根据特征自身的特点可以分为两类:描述物体外形的形状特征和描述物体灰度变换的纹理特征。根据特征提取所采用的方法的不同又可以分为统计特征和结构(句法)特征。特征选取的标准是,1)易提取;2)稳定性;3)具有区分度。

 

统计特征提取的方法有哪些?

直方图,在直方图基础上衍生出来的一些其他的方法,如均值、方差、熵、矩等;

灰度共生矩阵;

 

图像特征提取一般提取三个方面的特征,即颜色、纹理、形状。

 

颜色特征:

相对于RGB空间来说,HSV空间对光照(和噪声)鲁棒性好,所以将RGB转成HSV。根据HSV三个分量的范围,将颜色空间分成若干个color bins,统计颜色直方图。

Hhue)色彩,又称为色调,是指色彩的相貌,与色彩明暗无关;

SSaturation)饱和度,是色彩纯与不纯的分别;

VValue)亮度,是指色彩的明暗程度、光度的高低,越接近白色亮度越高。

但是颜色直方图并没有反映颜色空间分布的信息,也没有表达出图像中物体的形状。

纹理特征:

关于纹理,目前并没有统一的定义。我们可以理解成纹理元的重复,构成了纹理。纹理特征的提取方法可以分成四类:基于统计特征的纹理分析(如灰度共生矩阵、Tamura提出的6个特征的方法)、基于信号处理的分析(如小波变换)、基于结构的纹理分析、基于模型的纹理分析(如数字图像变换法、小波变换)。

1.      基于统计特征的纹理分析

基于统计特征的纹理分析是基于像元及其邻域的灰度属性,研究纹理区域中的统计特征或者像元及其邻域内的灰度的一阶、二阶、高阶统计特征。

应用最广

l  Tamura等从心理学角度定义的六个基本特征,即粗糙度(coarseness)、对比度(contrast)、方向性(directionality)、线像度(line likeness)、规则性(regularity)、粗略度(roughness),这是一组与人类视觉特性对应的纹理特征。

l  Amadasun等定义的基于邻域灰度差别矩阵的纹理特征,包括稀疏度、繁忙度、纹理粒度等5个特征。

l  Haralick等定义的基于灰度共生矩阵的纹理特征,常用统计量包括角二阶矩、对比度、相关、方差、熵等。

 

2.      基于信号处理的纹理分析

基于信号处理的纹理分析是建立在时域、频域分析与多尺度分析基础之上,对纹理图像中某个区域进行某种变换后,再提取保持相对平稳的特征值。

3.      基于模型的纹理分析

基于模型的纹理分析假设纹理是以某种参数控制的分布模型方式形成的,从纹理图像的实现来估计计算模型参数,以参数为特征或用某种分类策略进行图像分割。参数估计是该方法的核心问题。

4.      基于结构特征的纹理分析

l  句法(syntactic)纹理描述方法

l  数学形态学方法

适合周期性好的纹理,比如棋盘、布纹

使用范围较窄

 

 

形状特征:

形状特征主要包括基于边缘的特征和基于区域的特征。提取边缘特征,首先通过SoberCanny等边缘检测算子得到边缘,再计算链码、边缘梯度直方图等特征。但是这种方法有一定的缺陷,边缘信息是很不稳定的信息,内容相似的图片在边缘形状的视觉效果上也可能会存在很大的差异。基于区域的特征提取方法包括傅里叶变换、不变矩等,这种方法对图像的平移、旋转、伸缩具有不变性。

基于边缘特征的一种方法是检测边缘,得到角点,也就得到了物体的大致轮廓,然后计算相邻角点的n阶矩。

 

 

2018-12-23 14:38:21 HHH_ANS 阅读数 2631

1 - 引言

在我们进行图像识别的时候,往往是将图片中的特征来表示整张图片让计算机进行识别,基本上表示一个区域涉及两种选择:

  1. 外部特征
  2. 内部特征

下一步就是基于所选择的表示来描述区域

当我们关注的重点是形状特征时,可选择一种外部表示;而当关注的重点是内部属性如颜色和纹理时,可以选择一种内部表示。无论哪种情形,选择用来作为描绘子的特征都应尽可能地对大小、平移和旋转不敏感

2 - 表示

图像分割技术以沿着边界或包含在区域中的像素的形式产生原始数据,标准做法是使用某种方案将分割后的数据精简为更便于描绘子计算的表示。下面让我们学习一下各种表示方法

2.1 - 边界追踪算法

该算法输出的是排序后的点序列,我们假设:

  1. 处理的是二值图像,其目标和背景点分别标位1和0
  2. 图像已使用值为0的边界填充,因而消除了目标与图像边界合并的可能性

给定一个二值区域R或其边界,追踪R的边界或给定边界的算法由如下步骤组成:

  1. 令起始点b0b_0为图像中左上角标记为1的点。使用c0c_0表示b0b_0西侧的邻点。从c0c_0开始按顺时针方向考察b0b_0的8个邻点。令b1b_1表示所遇到的值为1的第一个邻点,并直接令c1c_1是序列中b1b_1之前的点。存储b0b_0b1b_1的位置,以便在步骤5中使用
  2. b=b1b=b_1c=c1c=c_1
  3. 从c开始按顺时针方向行进,令b的8个邻点为n1,n2,,n8n_1,n_2,\dots,n_8找到标记为1的第一个nkn_k
  4. b=nkb=n_kc=nk1c=n_{k-1}
  5. 重复步骤3和步骤4
    当算法停止时,所找到的b点的序列就构成了排列后的边界点的集合

在这里插入图片描述

2.2 - 佛雷曼(Freeman)链码

链码用于表示由顺次连接的具有指定长度和方向的直线段组成的边界。这种表示基于这些线段的4连接或8连接。每个线段的方向使用一种数字编号方案编码,如图所示,以这种方向性数字序列表示的编码称为佛雷曼(Freeman)链码。
链码的一次差分为,通过计算链码中分隔两个相邻像素的方向变化的数(按逆时针方向计算前一个数字变化到后一个数字所需的步数),其中第一元素是通过使用链码的最后一个元素和第一个元素间的转变来计算得到的。例如,4方向链码0231,得到的一次差分为3212,其中3为1逆时针转到0需3步;2为0逆时针转到2需2步;1为2逆时针转到3需1步;2为3逆时针转到1需2步。

在这里插入图片描述

2.3 - 使用最小周长多边形的多边形近似(MPP)

一副图像我们可以用多边形拟合它的形状。
在这里插入图片描述
我们的目的就是使用合适的最大可能单元大小,以最少的定点数来生产MPP,并且我们可以发现构成边界的多边形每个转向要么是一个凸定点,要么是一个凹顶点。
注意的是凹顶点(黑色)有一个对应的“镜像”顶点,位于凹顶点的对角处
在这里插入图片描述
因此,我们的算法就只需要关注这些顶点

MPP算法

令W(白)和B(黑)分别表示凸顶点镜像凹顶点
寻找MMP的算法使用两个“爬行”点:

  • 白色的爬行垫(WcW_c):WcW_c沿凸顶点(w)爬行
  • 黑色的爬行垫(BcB_c):BcB_c沿镜像凹顶点(B)爬行。

算法首先令Wc=Bc=V0W_c=B_c=V_0v0v_0是一个MPP顶点),VLV_L表示最后一个MPP顶点,VkV_k表示正在考察的当前顶点。
sgn(a,b,c)det(A)sgn(a,b,c)\equiv det(A)
(det(A)是A的行列式)
VL,VkV_L,V_k和两个爬行点之间存在如下三个条件之一:

  1. VkV_k位于通过VL,Wc(V_L,W_c)的直线的正的一侧,即sgn(WL,Wc,Vk)>0sgn(W_L,W_c,V_k)>0
  2. VkV_k位于通过VL,Wc(V_L,W_c)的直线的负的一侧,或者VkV_kVL,Wc(V_L,W_c)共线,即sgn(WL,Wc,Vk)0sgn(W_L,W_c,V_k)\leq 0。同时,VkV_k位于通过(VL,Bc)(V_L,B_c)的直线的正的一侧,或者VkV_k(VL,Bc)(V_L,B_c)共线,即sgn(VL,Bc,Vk)0sgn(V_L,B_c,V_k)\geq 0
  3. VkV_k位于通过VL,Bc(V_L,B_c)的直线的负的一侧,即sgn(VL,Bc,Vk)<0sgn(V_L,B_c,V_k)<0

如果条件1成立,则下一个MPP顶点是WCW_C并且我们令VL=WcV_L=W_c;然后我们令Wc=Bc=VLW_c=B_c=V_L来重新初始化该算法,并在VLV_L之后的下一个顶点继续执行算法

如果条件2成立,则VkV_k编程一个候选的MPP顶点。在这种情况下,如果VkV_k是凸顶点,则令Wc=VkW_c=V_k;否则,我们置Bc=VkB_c=V_k然后,我们使用列表中的下一顶点继续执行算法

如果条件3成立,则下一个MPP顶点是BcB_c,并且令VL=BcV_L=B_c;然后我们令Wc=Bc=VLW_c=B_c=V_L来重新初始化该算法,并用VLV_L之后的下一个顶点继续执行算法

当算法再次到达第一个顶点时,算法结束,此时算法已经处理了多边形中的所有顶点。

3 - 边界描绘子

3.1 - 一些简单的描述子

  1. 边界的长度
    边界的长度是最简的描述子之一。一条边界上的像素数量可以给出其长度的粗略近似。
  2. 边界的长轴与短轴
    边界B的直径定义为
    Diam(B)=maxij[D(pi,pj)]Diam(B)=max_{ij}[D(p_i,p_j)]
    pi,pjp_i,p_j是边界上的点,Dpj,pjD(p_j,p_j)是定义pip_ipjp_j之间的距离。直径的值和连接组成该直径两个端点的直线段(该直线称为边界的长轴)的方向是边界的有用描述子,边界的短轴定义为与长轴垂直的直线,且由边界与两个轴相交的4个外部点所组成的方框(该方框称为基本矩形),可以全完包围该边界
  3. 边界的偏向率
    长轴与短轴之比成为边界的偏心率

3.2 - 形状数

链码边界的一次差分取决于起始点。一条基于链码的边界的形状数,定义为最小量级的一次差分,即对链码的一次差分进行循环,得到的值最小的差分码为形状数。

3.3 - 傅里叶描述子

下图显示了xy平面内的一个K点数字边界,从任意点x0y0(x_0,y_0)开始,以逆时针方向在该边界上行进时,会遇到坐标对x0,y0,(x1,y1),(x2,y2),,(xk1,yk1)(x_0,y_0),(x_1,y_1),(x_2,y_2),\dots,(x_{k-1},y_{k-1})这些坐标可以表示为x(k)=xk,y(k)=ykx(k)=x_k,y(k)=y_k的形式,此外,每个坐标都可当做一个复数来处理

s(k)=x(k)+jy(k)s(k)=x(k)+jy(k)
式中有k=0,1,2,,K1k=0,1,2,\dots,K-1
s(k)的傅里叶变换为
a(u)=k=0K1s(k)ej2πuk/Ka(u)=\sum_{k=0}^{K-1}s(k)e^{-j2\pi uk/K}
式中u=0,1,2,,K1u=0,1,2,\dots,K-1复系数a(u)a(u)称为边界的傅里叶描述子。这些系数的傅里叶反变换可恢复s(k)
s(k)=1Ku=0K1a(u)ej2πuk/Ks(k)=\frac{1}{K}\sum_{u=0}^{K-1}a(u)e^{j2\pi uk/K}

然而,假设仅使用前P个傅里叶系数而不使用所有系数,等同于上式中令a(u)=0,u>P1a(u)=0,u>P-1结果s(k)s(k)的如下近似:
s^(k)=1Ku=0P1a(u)ej2πuk/P\hat s(k)=\frac{1}{K}\sum_{u=0}^{P-1}a(u)e^{j2\pi uk/P}

尽管求s^(k)\hat s(k)的每个成分时仅使用了P项,但k的范围仍然是从0到K-1,也就是说,在近似边界中存在同样数量的点,但项数不像在每个点的重建中那么多

由于高频成分说明精细细节,而低频成分决定全局形状,因此P越小,边界丢失的细节就越多

在这里插入图片描述

3.4 - 统计矩

如图(a),它显示了一段边界,图(b)显示了以任意变量rr的一维函数g(r)g(r)描述的线段,该函数是这样获得的:先将该线段的两个端点连接,然后旋转该直线,直至其为水平线段,此时所有的点的坐标也旋转同样的角度

g(r)g(r)归一化为单位面积,并把它当作直方图来处理,换句话说,g(ri)g(r_i)现在作为值rir_i出现的概率来处理,此时,r为一个随机变量,故n阶矩为
un(r)=i=0K1(rim)ng(ri)u_n(r)=\sum_{i=0}^{K-1}(r_i-m)^ng(r_i)
式中,m=i=0K1rig(ri)m = \sum_{i=0}^{K-1}r_ig(r_i)

K是边界上的点数,un(r)u_n(r)直接与g(r)g(r)的形状相关。例如,二阶矩u2(r)u_2(r)度量曲线关于r的均值扩展程度,而三阶矩u3ru_3(r)度量曲线关于均值的对称性

在这里插入图片描述

4 - 区域描述子

4.1 - 简单的区域描述子

  1. 区域的面积
    区域的面积定义为该区域中像素的数量
  2. 区域的周长
    区域的周长是其边界的长度
  3. 致密性
    致密性定义为(周长)2/^2/面积
  4. 圆周率
    圆周率即一个区域的面积与具有相同周长的一个圆(最致密形状)的面积之比。周长为P的一个圆的面积P2/4πP^2/4\pi。因此,圆周率RcR_c由下式给出:
    Rc=4πAp2R_c=\frac{4\pi A}{p^2}
    A是所讨论的区域面积,P是其周长
  5. 其他
    用作区域描述子的其他简单测度包括灰度值的均值和中值,最小灰度值和最大灰度值,以及其高于和低于均值的像素数

4.2 - 拓扑描述子

拓扑学研究未受任何变形影响的图形的特质,前提是该图形未被撕裂或粘连。
例如,图(a)显示了一个带有两个孔洞的区域。如果一个拓扑描述子由该区域内的孔洞数量来定义,那么这种性质明显不受拉伸或旋转变换的影响。
另一个对区域描述有用的拓扑特性是连通分量的数量。如图4(b)显示了一个具有3个连通分量的区域。

在这里插入图片描述

图形中孔洞的数量 H 和连通分量的数量 C ,可用于定义欧拉数 E :E = C - H

欧拉数也是一种拓扑特性。例如,图所示的区域有分别等于 0 和 −1 的欧拉数。
在这里插入图片描述

4.3 - 纹理

描绘区域的一种总要方法是量化该区域的纹理内容

出现处理中用于描述区域纹理的三种主要方法是:

  1. 统计方法(平滑、粗糙、粒状的等纹理特征)
  2. 结构方法(像元的排列,如基于规则间距平行线的纹理描述)
  3. 频谱方法(基于傅里叶频谱特性,主要用于检测图像中的全局周期性,方法是识别频谱中的高能量的窄波峰)

4.3.1 - 统计方法

描述纹理的最简单方法之一是使用一副图像或一个区域的灰度级直方图的统计矩。令Z是表示灰度的一个随机变量,并令p(zi),i=0,1,2,,L1p(z_i),i=0,1,2,\dots,L-1为相应的直方图,其中L是不同灰度级的数量,关于其均值的Z的第n阶矩为
un(z)=i=0L1(zim)np(zi)u_n(z)=\sum_{i=0}^{L-1}(z_i-m)^np(z_i)
m是z的均值(平均灰度)
m=i=0L1zip(zi)m=\sum_{i=0}^{L-1}z_ip(z_i)

注意u0=1,u1=0u_0=1,u_1=0二阶矩[方差σ2(z)=uz(z)\sigma^2(z)=u_z(z)]在纹理描述中特别重要。它是灰度对比度的度量,可用于建立相对平灰度的描述子,例如度量
R(z)=111+σ2(z)R(z)=1-\frac{1}{1+\sigma^2(z)}
对于恒定灰度区域为0(该区域方差为0),而对于较大的sigma2(z)sigma^2(z)值,其接近于1,因为对灰度级图像方差值增大而增大的。

三阶矩是直方图偏斜度的度量,而四阶矩是直方图相对平坦度的度量,五阶矩和更高阶矩不容易与直方图形状联系起来,但它们的确提供了纹理内容的进一步量化辨别。

在这里插入图片描述

使用直方图计算得到的纹理度量不懈怠像素彼此之间的相对位置的信息,但是这个信息很重要,所以我们使用一种方法叫共生矩阵

令Q是定义两个像素彼此相对位置的一个算子,并考虑一副具有L个可能灰度级的图像f,令G为一个矩阵,其元素gijg_{ij}是灰度为ziz_izjz_j的像素对出现在f中有Q所指定的位置处的次数,按照这种方法形成的矩阵成为灰度共生矩阵

在这里插入图片描述

在这里插入图片描述

4.3.2 - 结构方法

结构法的基本思想是,一个简单的“纹理基元”可借助一些规则用于形成更复杂的纹理模式,这些规则限制基元(或这些基元)的可能排列的数量。

4.3.3 - 频谱方法

对纹理描述有用的傅里叶频谱的三个特征:

  1. 频谱中突出的尖峰给出纹理模式的主要方向;
  2. 频率平面中尖峰的位置给出模式的基本空间周期;
  3. 采用滤波方法消除任何周期成分而留下非周期性图像元素,然后采用统计技术来描述。
2018-06-28 17:12:28 qq_28193895 阅读数 17210

参考

对常用特征点记录总结
图像处理特征不变算子系列之Harris算子(二)
图像处理特征不变算子系列之SUSAN算子(三)
【计算机视觉】SIFT中LoG和DoG比较
SIFT特征提取分析
RANSAC算法详解
Harris角点检测原理详解


Susan

SUSA(Smallest Univalue Segment Assimilating Nucleus)算子是一种高效的边缘和角点检测算子,并且具有结构保留的降噪功能

原理

用一个圆形模板在图像上移动,若模板内的像素灰度与模板中心的像素(被称为核Nucleus)灰度值小于一定的阈值,则认为该点与核Nucleus具有相同的灰度,满足该条件的像素组成的区域就称为USAN(Univalue Segment Assimilating Nucleus)。边缘处的点的USAN值小于或等于最大值一半。由此,我们可以得出SUSAN提取边缘和角点算法的基本原理:在边缘或角点处的USAN值最小,可以根据USAN区域的大小来检测边缘、角点等特征的位置和方向信息。

这里写图片描述

实现步骤

  1. 利用圆形模板遍历图像,计算每点处的USAN值
  2. 设置一阈值g,一般取值为1/2(Max(n)), 也即取值为USAN最大值的一半,进行阈值化,得到角点响应
  3. 使用非极大值抑制来寻找角点

优缺点

  • 完全不涉及梯度的运算,因此其抗噪声能力很强,运算量也比较小
  • SUSAN算子还是一个各向同性的算子
  • 图像的对比度较大,则可选取较大的t值,而图像的对比度较小,则可选取较小的t值
  • 不仅具有很好的边缘检测性能;而且对角点检测也具有很好的效果。

FAST

FAST( Features from Accelerated Segment Test)由Rosten等人在SUSAN角点特征检测方法的基础上利用机器学习方法提出.

原理

分割测试

在FAST角点检测算子中,一般是通过半径为3.4 pixel、外围16个像素的圆的作为模板筛选特征点。12点分割角点检测算法是在一个图像块上进行。其中p是中心像素点,12点取的是图上用弧线连接的12个点的像素值(通过测试,12点的角点检测性能最稳定、速度更快、效果也很好,有些文献指出9点的方式也很好)。

这里写图片描述

t是一个阈值(默认取值为10,不同场景取值有差异),Ip表示的是中心像素的像素值,Ipx表示的是圆形模板中的像素值。统计圆形区域中d或b的个数,只要d或b出现的次数大于n((当是12点分割测试角点检测时,n=12;当是9点时,则n=9),那么该点就被认为是候选角点。

Spx={d,Ipx<Ipt,darks,Ipt<Ipx<Ip+t,similiarb,Ipx>Ip+t,brighter

在分割测试步骤中,为了加快速度,其实不需要对这些像素进行逐一的比较。简单来说:首先比较1、5、9、13处点的像素值(也即水平方向和垂直方向上的4个点)与中心像素值的大小,如果这四个点中的像素值有3个或3个以上大于Ipx+t或小于Ipxt,那么则认为该处是一个候选角点,否则就不可能是角点。

ID3训练

将模板内的像素分成三部分d、s、b,分别记为:PdPsPb。因此对于每个Spx都属于PdPsPb中的一个。另外,令Kp为true,如果p为角点,否则为false。通过ID3算法来选择具有最大信息增益的像素来判断一个像素是否为角点。Kp的熵用下式来计算:

H(P)=(c+c)log2(c+c)clog2cclog2c

上式中c表示角点数量,c表示非角点数量。某一像素的信息增益通过下式表示:
H(P)H(Pd)H(Ps)H(Pb)

非极大值抑制

在上面的分割测试中,没有计算角点响应函数(Corner Response Function),非极大值抑制无法直接应用于提取的特征。因此,定义一个角点响应函数V,考虑到分割测试的特征以及计算速度的需要,角点响应函数的定义如下:

V=max(xϵSbright|IpxIp|t,xϵSdark|IpxIp|t)

实现步骤

  1. 对固定半径圆上的像素进行分割测试,通过逻辑测试可以去处大量的非特征候选点;
  2. 基于分类的角点特征检测,利用ID3 分类器根据16个特征判决候选点是否为角点特征,每个特征的状态为一1,0,1。
  3. 利用非极大值抑制进行角点特征的验证。

优缺点

  • 计算速度快,可以应用于实时场景中
  • 容易受到噪声影响,阈值t的影响也较大

BRIEF

Brief为特征描述子,对已检测到的特征点进行描述,是一种二进制编码描述子

实现步骤

  1. 为减少噪声干扰,先对图像进行高斯滤波(方差2,窗口9x9)
  2. 以特征点为中心,取SxS的邻域大窗口。在大窗口中随机选取(有5种经典方法)一对(两个)5x5的子窗口,比较子窗口内的像素和(可用积分图像完成),进行二进制赋值。(一般S=31),其中p(x),p(y)分别为所在5x5子窗口的像素和
    τ(p;x,y):={1,if p(x)<p(y)0,otherwise

这里写图片描述

  1. 在大窗口中随机选取N对子窗口,重复步骤2的二进制赋值,形成一个二进制编码,这个编码就是对特征点的描述,即特征描述子。(一般N=256)构造一个512个bit的BRIEF,就需要512对[x,y],且需要注意,它们是有序的,每次计算位置都相同,否则影响最终结果。也就说说,一旦选定了512对[x,y],那么,无论是提取特征,还是匹配特征,都要按照这512对进行计算。
  2. 汉明距离进行配对。两个特征编码对应bit位上相同元素的个数小于128的,一定不是配对的。一幅图上特征点与另一幅图上特征编码对应bit位上相同元素的个数最多的特征点配成一对。

优缺点

  • 抛弃了传统的用梯度直方图描述区域的方法,改用检测随机响应,大大加快了描述子建立速度
  • 生成的二进制描述子便于高速匹配,计算Hamming距离只需通过异或操作加上统计二进制编码中“1”的个数的操作,这些通过底层的运算即可实现
  • 缺点很明显就是旋转不变性较差

ORB


DoG

DoG算子是由Lowe D.G.提出的,对噪声、尺度、仿射变化和旋转等具有很强的鲁棒性,能够提供更丰富的局部特征信息

原理

尺度空间

在用机器视觉系统分析未知场景时,机器并不知道图像中物体的尺度,只有通过对图像的多尺度描述,才能获得对物体感知的最佳尺度。如果在不同尺度上,对输入的图像都能检测到相同的关键点特征,那么在不同尺度下也可以实现关键点的匹配,从而实现关键点的尺度不变特性

图像金字塔多分辨率

金字塔是早期图像多尺度的表示形式,图像金字塔一般包括2个步骤,分别是使用低通滤波平滑图像;对图像进行降采样(也即图像缩小为原来的1/4,长宽高缩小为1/2),从而得到一系列尺寸缩小的图像。金字塔的构造如下所示:

这里写图片描述

高斯平滑滤波

高斯核是唯一可以产生多尺度空间的核。一个图像的尺度空间L(x,y,σ) ,定义为原始图像I(x,y)与一个可变尺度的2维高斯函数G(x,y,σ)卷积运算。 二维空间高斯函数:

G(xi,yi,σ)=12πσ2exp((xxi)2+(yyi)22σ2)

尺度空间表示为:
L(x,y,σ)=G(x,y,σ)I(x,y)

高斯模版是圆对称的,且卷积的结果使原始像素值有最大的权重,距离中心越远的相邻像素值权重也越小。高斯模糊另一个重要的性质就是线性可分,使用二维矩阵变换的高斯模糊可以通过在水平和竖直方向各进行一维高斯矩阵变换相加得到。

多尺度与多分辨率

尺度空间表达和金字塔多分辨率表达之间最大的不同是:
1. 尺度空间表达是由不同高斯核平滑卷积得到,在所有尺度上有相同的分辨率
2. 金字塔多分辨率表达每层分辨率减少固定比率
所以,金字塔多分辨率生成较快,且占用存储空间少;而多尺度表达随着尺度参数的增加冗余信息也变多。多尺度表达的优点在于图像的局部特征可以用简单的形式在不同尺度上描述;而金字塔表达没有理论基础,难以分析图像局部特征。

拉普拉斯金字塔

结合尺度空间表达和金字塔多分辨率表达,就是在使用尺度空间时使用金字塔表示,在计算机视觉中最有名莫过于拉普拉斯金字塔。拉普拉斯金字塔顾名思义就是通过对图像进行拉普拉斯操作,然后进行一个降采样的过程。具体来说就是:原始图像作为金字塔的底层,也即0层,称为g0,对0层图像g0进行进行拉普拉斯金操作,得到第一层图像g1;接着对第一层图像进行拉普拉斯操作,得到第二层图像g2,依次类推,并进行一个降采样,如此构造拉普拉斯金字塔。

DoG金字塔

DoG(Difference of Gaussian)其实是对高斯拉普拉斯(LoG)的近似,在某一尺度上的特征检测可以通过对两个相邻高斯尺度空间的图像相减,得到DoG的响应值图像D(x,y,σ),这比直接计算LoG效率更高。

  • 对原图进行相邻尺度的高斯滤波
    g1=Gσ1(x,y)f(x,y)

    g2=Gσ2(x,y)f(x,y)
  • 将上面的滤波得到的两幅图像相减:
    g1(x,y)g2(x,y)=Gσ1f(x,y)Gσ2f(x,y)=(Gσ1Gσ2)f(x,y)=DoGf(x,y)
  • 将公式简化写法:

    D(x,y,σ)=(G(x,y,kσ)G(x,y,σ))I(x,y)
    =L(x,y,kσ)L(x,y,σ)

  • 构造高斯金字塔
    为了得到DoG图像,首先要构造高斯金字塔,高斯金字塔在多分辨率金字塔的基础上加入了高斯滤波,也就是对金字塔每层图像采用不同的参数sigma进行了高斯卷积,使得金字塔的每层有多张图片组成为一个Octave,每组有多张(也叫层interval)图像。每个Octave是由同一大小的图像,经过不同sigma高斯滤波得到的,而Interval则表示的是同一个sigma高斯滤波的图像。另外,降采样时,金字塔上边一组图像的第一张图像(最底层的一张)是由前一组(金字塔下面一组)图像的倒数第三张隔点采样得到,图像表示如下:

这里写图片描述

  • 求DoG

这里写图片描述

求角点

这里写图片描述

X标记当前像素点,绿圈标记邻接像素点,用这个方式,最多检测相邻尺度的26个像素点。如果它是所有邻接像素点的最大值或最小值点,则X被标记为特征点,如此依次进行,则可以完成图像的特征点提取。

这里写图片描述

这里写图片描述

优缺点

  • 具有尺度不变特性,抗旋转
  • 计算量大

RANSC特征点筛选

随机抽样一致算法(random sample consensus,RANSAC),采用迭代的方式从一组包含离群的被观测数据中估算出数学模型的参数。

RANSAC算法的基本假设是样本中包含正确数据(inliers,可以被模型描述的数据),也包含异常数据(outliers,偏离正常范围很远、无法适应数学模型的数据),即数据集中含有噪声。这些异常数据可能是由于错误的测量、错误的假设、错误的计算等产生的。同时RANSAC也假设,给定一组正确的数据,存在可以计算出符合这些数据的模型参数的方法。

实现步骤

  • 假定模型(如直线方程),并随机抽取Nums个(以2个为例)样本点,对模型进行拟合
  • 由于不是严格线性,数据点都有一定波动,假设容差范围为:sigma,找出距离拟合曲线容差范围内的点,并统计点的个数
  • 重新随机选取Nums个点,重复第一步~第二步的操作,直到结束迭代
  • 每一次拟合后,容差范围内都有对应的数据点数,找出数据点个数最多的情况,就是最终的拟合结果

这里写图片描述

优缺点

  • 最小二乘法适用于有效数据占大多数,无效数据少的情况,是从一个整体误差最小的角度去考虑。RANSC基于假设寻找最优。

这里写图片描述


Harris角点检测

原理

用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点。

  • 数学刻画

    E(U,V)=x,yw(x,y)[I(x+u,y+v)I(x,y)]2

    式中,[u,v]是窗口的偏移量,w(x,y)是窗口的权重系数。一般可用高斯二维函数。

  • 表达式演化-泰勒展开

    f(x+u,y+v)f(x,y)+ufx(x,y)+vfy(x,y)

(1)[I(x+u,y+v)I(x,y)]2[I(x,y)+uIx+vIyI(x,y)]2(2)=u2Ix2+2uvIxIy+v2Iy2(3)=[uv][Ix2IxIyIxIyIy2][uv](4)=[uv]([Ix2IxIyIxIyIy2])[uv]

  • E(u,v)
    E(u,v)[uv]M[uv]

    M=x,yw(x,y)[Ix2IxIyIxIyIy2]

实现步骤

  1. 对每一个像素计算自相关矩阵M
  2. 构造角点性映射图

    M=[ACCB]

    C(x,y)=det(M)k(trace(M))2

    det(M)=λ1λ2=ABC2

    trace(M)=λ1+λ2=A+B

  3. 阈值化,对得到的C(x,y)

  4. 非极大值抑制

优缺点

  • 针对Moravec算子的不足进行了改进,提高了特征点的检测率
  • Harris算子计算量大,对尺度很敏感,不具有尺度不变性
  • Harris对特征点的定位也不是很精确
  • Harris也是各向异性的,对噪声敏感。



2018-11-14 12:38:34 tony2278 阅读数 4367
8276898f9b4ae5d60117bbab07e23eee3ee2ca80.jpg

【黑暗之魂】 史诗向/神话/无火的余烬

 

 

 

知乎上看到一个话题——
目前火热的 Deep Learning 会灭绝传统的 SIFT / SURF 特征提取方法吗?


由于之前研究过SIFT和HOG这两种传统的特征提取方法,故本篇文章先对SIFT和HOG作一综述,并比较二者优缺点。之后,将SIFT和HOG同神经网络特征提取做一对比,浅谈对上述问题的看法。如果能写得快一些,再简单介绍其他几种传统的特征提取的方法——SURF、ORB、LBP、HAAR等等。


目录

[1] SIFT(尺度不变特征变换)
[2] HOG(方向梯度直方图)
[3] SIFT和HOG的比较
[4] SIFT/HOG与神经网络特征提取的比较
[5] 其他传统特征提取的方法(SURF、ORB、LBP、HAAR)


先对几个概念和问题做一个解释:

  • 图像为什么要灰度化?
  1. 识别物体,最关键的因素是梯度(SIFT/HOG),梯度意味着边缘,这是最本质的部分,而计算梯度,自然就用到灰度图像了,可以把灰度理解为图像的强度。
  2. 颜色,易受光照影响,难以提供关键信息,故将图像进行灰度化,同时也可以加快特征提取的速度。
  • 仿射不变性
  • 平面上任意两条线,经过仿射变换后,仍保持原来的状态(比如平行的线还是平行,相交的线夹角不变等)

    什么是局部特征?局部特征应该具有的特点?

     

 

局部特征从总体上说是图像或在视觉领域中一些有别于其周围的地方;局部特征通常是描述一块区域,使其能具有高可区分度;局部特征的好坏直接会决定着后面分类、识别是否会得到一个好的结果。

局部特征应该具有的特点: 可重复性、可区分性、准确性、有效性(特征的数量、特征提取的效率)、鲁棒性(稳定性、不变性)。


[1] SIFT(尺度不变特征变换)

1.1 SIFT特征提取的实质

在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出、不会因光照、仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。

1.2 SIFT特征提取的方法

1. 构建DOG尺度空间:

模拟图像数据的多尺度特征,大尺度抓住概貌特征,小尺度注重细节特征。通过构建高斯金字塔(每一层用不同的参数σ做高斯模糊(加权)),保证图像在任何尺度都能有对应的特征点,即保证尺度不变性

2. 关键点搜索和定位:

确定是否为关键点,需要将该点与同尺度空间不同σ值的图像中的相邻点比较,如果该点为max或min,则为一个特征点。找到所有特征点后,要去除低对比度和不稳定的边缘效应的点,留下具有代表性的关键点(比如,正方形旋转后变为菱形,如果用边缘做识别,4条边就完全不一样,就会错误;如果用角点识别,则稳定一些)。去除这些点的好处是增强匹配的抗噪能力和稳定性。最后,对离散的点做曲线拟合,得到精确的关键点的位置和尺度信息。

3. 方向赋值:

为了实现旋转不变性,需要根据检测到的关键点的局部图像结构为特征点赋值。具体做法是用梯度方向直方图。在计算直方图时,每个加入直方图的采样点都使用圆形高斯函数进行加权处理,也就是进行高斯平滑。这主要是因为SIFT算法只考虑了尺度和旋转不变形,没有考虑仿射不变性。通过高斯平滑,可以使关键点附近的梯度幅值有较大权重,从而部分弥补没考虑仿射不变形产生的特征点不稳定。注意,一个关键点可能具有多个关键方向,这有利于增强图像匹配的鲁棒性

4. 关键点描述子的生成:

关键点描述子不但包括关键点,还包括关键点周围对其有贡献的像素点。这样可使关键点有更多的不变特性,提高目标匹配效率。在描述子采样区域时,需要考虑旋转后进行双线性插值,防止因旋转图像出现白点。同时,为了保证旋转不变性,要以特征点为中心,在附近领域内旋转θ角,然后计算采样区域的梯度直方图,形成n维SIFT特征矢量(如128-SIFT)。最后,为了去除光照变化的影响,需要对特征矢量进行归一化处理。

1.3 SIFT特征提取的优点

  1. SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;
  2. 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;
  3. 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;
  4. 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;
  5. 可扩展性,可以很方便的与其他形式的特征向量进行联合;
  6. 需要较少的经验主义知识,易于开发。

1.4 SIFT特征提取的缺点

  1. 实时性不高,因为要不断地要进行下采样和插值等操作;
  2. 有时特征点较少(比如模糊图像);
  3. 对边缘光滑的目标无法准确提取特征(比如边缘平滑的图像,检测出的特征点过少,对圆更是无能为力)。

1.5 SIFT特征提取可以解决的问题:

目标的自身状态、场景所处的环境和成像器材的成像特性等因素影响图像配准/目标识别跟踪的性能。而SIFT算法在一定程度上可解决:

  1. 目标的旋转、缩放、平移(RST)
  2. 图像仿射/投影变换(视点viewpoint)
  3. 光照影响(illumination)
  4. 目标遮挡(occlusion)
  5. 杂物场景(clutter)
  6. 噪声

近来不断有人改进,其中最著名的有 SURF(计算量小,运算速度快,提取的特征点几乎与SIFT相同)和 CSIFT(彩色尺度特征不变变换,顾名思义,可以解决基于彩色图像的SIFT问题)。


[2] HOG(方向梯度直方图)

2.1 HOG特征提取的实质

通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。

2.2 HOG特征提取的方法

  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了。这个就是最终的可供分类使用的特征向量了。

2.3 HOG特征提取特点

  1. 由于HOG是在图像的局部方格单元上操作,所以它对图像几何的和光学的形变都能保持很好的不变性,这两种形变只会出现在更大的空间领域上。
  2. 在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下,只要行人大体上能够保持直立的姿势,可以容许行人有一些细微的肢体动作,这些细微的动作可以被忽略而不影响检测效果。因此HOG特征是特别适合于做图像中的人体检测的。

[3] SIFT和HOG的比较

共同点:都是基于图像中梯度方向直方图的特征提取方法

不同点:

SIFT 特征通常与使用SIFT检测器得到的兴趣点一起使用。这些兴趣点与一个特定的方向和尺度相关联。通常是在对一个图像中的方形区域通过相应的方向和尺度变换后,再计算该区域的SIFT特征。

HOG特征的单元大小较小,故可以保留一定的空间分辨率,同时归一化操作使该特征对局部对比度变化不敏感。

结合SIFT和HOG方法,可以发现SIFT对于复杂环境下物体的特征提取具有良好的特性;而HOG对于刚性物体的特征提取具有良好的特性。

笔者曾做过一个自然场景分类的实验,发现SIFT的准确率比HOG高,而如果检测像人这种刚性的object,HOG的表现要比SIFT好。


[4] SIFT/HOG与神经网络特征提取的比较

众所周知,随着深度学习的发展,通过神经网络提取特征得到了广泛的应用,那么,神经网络提取的特征与传统的SIFT/HOG等特征提取方法有什么不同呢?

4.1 神经网络提取到的特征

我们知道,对于一副图像,像素级的特征没有任何价值,而如果特征是一个具有结构性(或者说有含义)的时候,比如摩托车是否具有车把手,是否具有车轮,就很容易把摩托车和非摩托车区分,学习算法才能发挥作用。

早期,两个科学家Bruno Olshausen和 David Field通过实验研究了这个问题,发现一个复杂图像往往由一些基本结构组成。比如下图:一个图可通过用64种正交的edges(可以理解成正交的基本结构)来线性表示。比如样例的x可以用1-64个edges中的三个按照0.8,0.3,0.5的权重调和而成。而其他基本edges没有贡献,均为0 。


具体实验可以参考文章:
Deep Learning(深度学习)关于特征

小块的图形可以由基本edge构成,更结构化,更复杂的,就需要更高层次的特征表示,高层表达由低层表达的组合而成。如图所示:


这就是神经网络每层提取到的特征。由于是通过神经网络自动学习到了,因此也是无监督的特征学习过程(Unsupervised Feature Learning) 。直观上说,就是找到make sense的小patch再将其进行combine,就得到了上一层的feature,递归地向上learning feature。在不同object上做training是,所得的edge basis 是非常相似的,但object parts和models 就会completely different了。

 

4.2 传统特征提取方法与神经网络特征提取的比较

观点1:传统特征提取方法的研究过程和思路是非常有用的,因为这些方法具有较强的可解释性,它们对设计机器学习方法解决此类问题提供启发和类比。有部分人认为(也有部分人反对)现有的卷积神经网络与这些特征提取方法有一定类似性,因为每个滤波权重实际上是一个线性的识别模式,与这些特征提取过程的边界与梯度检测类似。同时,池化(Pooling)的作用是统筹一个区域的信息,这与这些特征提取后进行的特征整合(如直方图等)类似。通过实验发现卷积网络开始几层实际上确实是在做边缘和梯度检测。不过事实上卷积网络发明的时候,还没有这些特征提取方法。

观点2: 深度学习的数据需求量大对于视觉来说是个伪命题。许多研究成果已经表明深度学习训练得到的模型具有很强的迁移能力,因此在大数据集上训练完成的模型只要拿过来在小数据集上用就可以,不需要完全重新训练。这种方式在小数据集上的结果往往也比传统方法好。

观点3:还是需要重新训练的,只能说大数据集训练好的模型提供了一个比较好的参数初始化。而且卷积前几层提取特征仅仅是对分类问题是对的,但是对于一些dense prediction还是不一样,毕竟提取特征不一定有用,还是task dependent。

观点4:深度学习是一种自学习的特征表达方法,比SIFT/HOG这些依靠先验知识设计的feature的表达效果高。早在13年大家都发现神经网络的最后一层的local特征和SIFT性质差不多,但是表达能力强太多。SIFT能做的事情CNN都能做,表达效果也强,那深度学习取代SIFT是迟早的事情(或者说已经发生的事情)。深度神经网络识别率的提高不需要建立在需求大量训练样本的基础上,拿pre-train好的模型直接用就可以了。在一些没有训练样本的应用(图像分割(image stithing)/ 立体匹配(stereo mathing)) ,可以把卷积层的activation提取出来做stitching的local feature(感觉是一个可以探索的方向)。未来还有SIFT/SURF这种固定特征提取算法的生存空间吗?除非是嵌入式这种计算资源极端受限的情况,但是现在大家都在试着implement CNN FPGA甚至ASIC了。

观点5:2016年ECCV上举办的一个local feature的工作会,发现在核心匹配问题上,CNN并没有什么突破性的进展。在Oxford大学的VGG组提供的Hpatch数据集上,发现rootsiftpca效果最好,如图:


那么提出两个问题:(1)现在流行的特征学习方法siamese或triplet等结构是否缺失了什么? (2)虽然CNN可以挖掘patch里面包含的信息并建立对于复杂几何和光照变化的不变性,但是这种学习到的不变性是否过度依赖于数据而无法有效泛化到真实匹配场景中所遇到的影像之间的复杂变化呢?

 


[5] 其他传统特征提取的方法(SURF、ORB、LBP、HAAR)

SURF、ORB、LBP可以参考文章:
图像特征检测描述(一):SIFT、SURF、ORB、HOG、LBP特征的原理概述及OpenCV代码实现

5.1 SURF

前面提到SITF的缺点是如果不借助硬件加速或专门的图像处理器很难达到实现,所以人们就要想办法对SITF算子进行改进,SURF算子便是对SIFT的改进,不过改进之后在算法的运行时间上还是没有质的飞跃。后面要介绍的ORB特征描述算子在运行时间上才是一种质的飞跃。

SURF主要是把SIFT中的某些运算作了简化。SURF把SIFT中的高斯二阶微分的模板进行了简化,使得卷积平滑操作仅需要转换成加减运算,这样使得SURF算法的鲁棒性好且时间复杂度低。SURF最终生成的特征点的特征向量维度为64维。

5.2 ORB

ORB特征描述算法的运行时间远优于SIFT与SURF,可用于实时性特征检测。ORB特征基于FAST角点的特征点检测与描述技术,具有尺度与旋转不变性,同时对噪声及透视仿射也具有不变性,良好的性能使得用ORB在进行特征描述时的应用场景十分广泛。

ORB特征检测主要分为以下两个步骤:

①方向FAST特征点检测: FAST角点检测是一种基于机器学习的快速角点特征检测算法,具有方向的FAST特征点检测是对兴趣点所在圆周上的16个像素点进行判断,若判断后的当前中心像素点为暗或亮,将候定其是否为角点。FAST角点检测计算的时间复杂度小,检测效果突出。FAST角点检测为加速算法实现,通常先对回周上的点集进行排序,排序使得其计算过程大大得到了优化。FAST对多尺度特性的描述是还是通过建立图像金字塔实现的,而对于旋转不变性即方向的特征则引入灰度质心法用于描述特征点的方向。

②BRIEF特征描述: BRIEF描述子主要是通过随机选取兴趣点周围区域的若干点来组成小兴趣区域,将这些小兴趣区域的灰度二值化并解析成二进制码串,将串特征作为该特征点的描述子,BRIEF描述子选取关键点附近的区域并对每一位比较其强度大小,然后根据图像块中两个二进制点来判断当前关键点编码是0还是1.因为BRIEF描述子的所有编码都是二进制数的,这样就节省了计算机存储空间。

5.3 LBP

LBP(Local Binary Pattern),局部二值模式是一种描述图像局部纹理的特征算子,具有旋转不变性与灰度不变性等显著优点。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用正方形来描述图像的纹理特征,其缺点是难以满足不同尺寸和频率的需求。Ojala等人对经典LBP进行了改进,提出了将3×3的正方形窗口领域扩展到任意圆形领域。由于圆形LBP采样点在圆形边界上,那么必然会导致部分计算出来的采样点坐标不是整数,因此这里就需要对得到的坐标像素点值进行处理,常用的处理方法是最近邻插值或双线性插值。

放一张SIFT/HOG/LBP优缺点、适用范围对比图:

 

5.4 HAAR

人脸检测最为经典的算法Haar-like特征+Adaboost。这是最为常用的物体检测的方法(最初用于人脸检测),也是用的最多的方法。

训练过程: 输入图像->图像预处理->提取特征->训练分类器(二分类)->得到训练好的模型;

测试过程:输入图像->图像预处理->提取特征->导入模型->二分类(是不是所要检测的物体)。

Haar-like特征是很简单的,无非就是那么几种,如两矩形特征、三矩形特征、对角特征。后来,还加入了边缘特征、线特征、中心环绕特征等。使用积分图可以加速计算特征。最后,使用集成的方法Adaboost进行训练。


本篇文章到此结束,有什么错误欢迎指正!


补充:
1、SIFT / HOG 不同点: SIFT提取的关键点是角点,HOG提取的是边缘特征。
2、传统特征提取 / CNN特征提取不同点:传统特征提取方法的检测算子一般是人为设计好的,是经过大量的先验知识总结得到的;CNN特征提取相当于在训练一个个filter(过滤器、卷积核),这些filter相当于传统特征提取方法中的检测算子。因此,CNN特征提取是利用神经网络的自主学习得到的。

 

转自:图像处理之特征提取

 

2016-06-17 17:13:50 boon_228 阅读数 12693

  LBPLocal Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子;它具有旋转不变性和灰度不变性等显著的优点。它是首先由T. Ojala, M.Pietikäinen, D. Harwood 1994年提出,用于纹理特征提取。而且,提取的特征是图像的局部的纹理特征;

1LBP特征的描述

       原始的LBP算子定义为在3*3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该窗口中心像素点的LBP值,并用这个值来反映该区域的纹理信息。如下图所示:

 

LBP的改进版本:

       原始的LBP提出后,研究人员不断对其提出了各种改进和优化。

1)圆形LBP算子:

        基本的 LBP算子的最大缺陷在于它只覆盖了一个固定半径范围内的小区域,这显然不能满足不同尺寸和频率纹理的需要。为了适应不同尺度的纹理特征,并达到灰度和旋转不变性的要求,Ojala等对 LBP 算子进行了改进,将 3×3邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域,改进后的 LBP 算子允许在半径为 R 的圆形邻域内有任意多个像素点。从而得到了诸如半径为R的圆形区域内含有P个采样点的LBP算子;

2LBP旋转不变模式

       从 LBP 的定义可以看出,LBP 算子是灰度不变的,但却不是旋转不变的。图像的旋转就会得到不同的 LBP值。

         Maenpaa等人又将 LBP算子进行了扩展,提出了具有旋转不变性的 LBP 算子,即不断旋转圆形邻域得到一系列初始定义的 LBP值,取其最小值作为该邻域的 LBP 值。

       图 2.5 给出了求取旋转不变的 LBP 的过程示意图,图中算子下方的数字表示该算子对应的 LBP值,图中所示的 8  LBP模式,经过旋转不变的处理,最终得到的具有旋转不变性的 LBP值为 15。也就是说,图中的 8 LBP 模式对应的旋转不变的 LBP模式都是00001111

3LBP等价模式

       一个LBP算子可以产生不同的二进制模式,对于半径为R的圆形区域内含有P个采样点的LBP算子将会产生P2种模式。很显然,随着邻域集内采样点数的增加,二进制模式的种类是急剧增加的。例如:5×5邻域内20个采样点,有2201,048,576种二进制模式。如此多的二值模式无论对于纹理的提取还是对于纹理的识别、分类及信息的存取都是不利的。同时,过多的模式种类对于纹理的表达是不利的。例如,将LBP算子用于纹理分类或人脸识别时,常采用LBP模式的统计直方图来表达图像的信息,而较多的模式种类将使得数据量过大,且直方图过于稀疏。因此,需要对原始的LBP模式进行降维,使得数据量减少的情况下能最好的代表图像的信息。

        为了解决二进制模式过多的问题,提高统计性,Ojala提出了采用一种“等价模式”(Uniform Pattern)来对LBP算子的模式种类进行降维。Ojala等认为,在实际图像中,绝大多数LBP模式最多只包含两次从10或从01的跳变。因此,Ojala将“等价模式”定义为:当某个LBP所对应的循环二进制数从01或从10最多有两次跳变时,该LBP所对应的二进制就称为一个等价模式类。000000000次跳变),00000111(只含一次从01的跳变),10001111(先由1跳到0,再由0跳到1,共两次跳变)都是等价模式类。除等价模式类以外的模式都归为另一类,称为混合模式类,例如10010111(共四次跳变)(这是我的个人理解,不知道对不对)。

       通过这样的改进,二进制模式的种类大大减少,而不会丢失任何信息。模式数量由原来的2P种减少为 P ( P-1)+2种,其中P表示邻域集内的采样点数。对于3×3邻域内8个采样点来说,二进制模式由原始的256种减少为58种,这使得特征向量的维数更少,并且可以减少高频噪声带来的影响。

 

2LBP特征用于检测的原理

       显而易见的是,上述提取的LBP算子在每个像素点都可以得到一个LBP“编码”,那么,对一幅图像(记录的是每个像素点的灰度值)提取其原始的LBP算子之后,得到的原始LBP特征依然是“一幅图片”(记录的是每个像素点的LBP值)。

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

       因为,从上面的分析我们可以看出,这个“特征”跟位置信息是紧密相关的。直接对两幅图片提取这种“特征”,并进行判别分析的话,会因为“位置没有对准”而产生很大的误差。后来,研究人员发现,可以将一幅图片划分为若干的子区域,对每个子区域内的每个像素点都提取LBP特征,然后,在每个子区域内建立LBP特征的统计直方图。如此一来,每个子区域,就可以用一个统计直方图来进行描述;整个图片就由若干个统计直方图组成;

        例如:一幅100*100像素大小的图片,划分为10*10=100个子区域(可以通过多种方式来划分区域),每个子区域的大小为10*10像素;在每个子区域内的每个像素点,提取其LBP特征,然后,建立统计直方图;这样,这幅图片就有10*10个子区域,也就有了10*10个统计直方图,利用这10*10个统计直方图,就可以描述这幅图片了。之后,我们利用各种相似性度量函数,就可以判断两幅图像之间的相似性了;

 

3、对LBP特征向量进行提取的步骤

1)首先将检测窗口划分为16×16的小区域(cell);

2)对于每个cell中的一个像素,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经比较可产生8位二进制数,即得到该窗口中心像素点的LBP值;

3)然后计算每个cell的直方图,即每个数字(假定是十进制数LBP值)出现的频率;然后对该直方图进行归一化处理。

4)最后将得到的每个cell的统计直方图进行连接成为一个特征向量,也就是整幅图的LBP纹理特征向量;

然后便可利用SVM或者其他机器学习算法进行分类了。


4、opencv LBP特征提取

一)一般的LBP,256维

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //====================================================================       
  2. //====================================================================    
  3. #include <cv.h>  
  4. #include <highgui.h>  
  5.   
  6. void LBP(IplImage* src, IplImage* dst)  
  7. {  
  8.     int width=src->width;  
  9.     int height=src->height;  
  10.     for(int j=1;j<width-1;j++)  
  11.     {  
  12.         for(int i=1;i<height-1;i++)  
  13.         {  
  14.             uchar neighborhood[8]={0};  
  15.             neighborhood[7] = CV_IMAGE_ELEM( src, uchar, i-1, j-1);  
  16.             neighborhood[6] = CV_IMAGE_ELEM( src, uchar, i-1, j);  
  17.             neighborhood[5] = CV_IMAGE_ELEM( src, uchar, i-1, j+1);  
  18.             neighborhood[4] = CV_IMAGE_ELEM( src, uchar, i, j-1);  
  19.             neighborhood[3] = CV_IMAGE_ELEM( src, uchar, i, j+1);  
  20.             neighborhood[2] = CV_IMAGE_ELEM( src, uchar, i+1, j-1);  
  21.             neighborhood[1] = CV_IMAGE_ELEM( src, uchar, i+1, j);  
  22.             neighborhood[0] = CV_IMAGE_ELEM( src, uchar, i+1, j+1);  
  23.             uchar center = CV_IMAGE_ELEM( src, uchar, i, j);  
  24.             uchar temp=0;  
  25.   
  26.             for(int k=0;k<8;k++)  
  27.             {  
  28.                 temp+=(neighborhood[k]>=center)<<k;  
  29.             }  
  30.             CV_IMAGE_ELEM( dst, uchar, i, j)=temp;  
  31.         }  
  32.     }  
  33. }  
  34.   
  35. int main()  
  36. {  
  37.     IplImage* img=cvLoadImage("lena.jpg", 0);  
  38.     IplImage* dst=cvCreateImage(cvGetSize(img),8,1);  
  39.     LBP(img,dst);  
  40.     cvNamedWindow("图像", 1);  
  41.     cvShowImage("图像", dst);  
  42.     cvWaitKey(0);  
  43.     cvDestroyAllWindows();  
  44.     cvReleaseImage(&img);  
  45.     cvReleaseImage(&dst);  
  46.   
  47.     return 0;  
  48. }  
结果图像为:


二)Uniform Pattern的LBP,将256维降为59维。
绝大多数LBP模式最多只包含两次从1到0或从0到1的跳变。因此,Ojala将Uniform Pattern定义为:当某个LBP所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该LBP所对应的二进制就称为一个等价模式类。

代码一:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>  
  2. typedef unsigned char uchar;  
  3. int getHopCount(uchar i)  
  4. {  
  5.     int a[8]={0};  
  6.     int k=7;  
  7.     int cnt=0;  
  8.     while(i)  
  9.     {  
  10.         a[k]=i&1;  
  11.         i>>=1;  
  12.         --k;  
  13.     }  
  14.     for(int k=0;k<8;++k)  
  15.     {  
  16.         if(a[k]!=a[k+1==8?0:k+1])  
  17.         {  
  18.             ++cnt;  
  19.         }  
  20.     }  
  21.     return cnt;  
  22. }  
  23.   
  24. int main()    
  25. {  
  26.     int cnt[9]={0};  
  27.     for(int i=0;i<256;++i)  
  28.     {  
  29.         cnt[getHopCount(i)]++;  
  30.     }  
  31.     for(int i=0;i<9;++i)  
  32.     {  
  33.         printf("跳变%d次的数目:%d\n",i,cnt[i]);  
  34.     }  
  35.     return 0;   
  36. }  

输出结果为:
跳变0次的数目:2
跳变1次的数目:0
跳变2次的数目:56
跳变3次的数目:0
跳变4次的数目:140
跳变5次的数目:0
跳变6次的数目:56
跳变7次的数目:0
跳变8次的数目:2
可见:56+2+1==59,所以有59维。

代码二:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //====================================================================    
  2. //====================================================================   
  3. #include <cv.h>  
  4. #include <highgui.h>  
  5.   
  6. int getHopCount(uchar i)  
  7. {  
  8.     int a[8]={0};  
  9.     int k=7;  
  10.     int cnt=0;  
  11.     while(i)  
  12.     {  
  13.         a[k]=i&1;  
  14.         i>>=1;  
  15.         --k;  
  16.     }  
  17.     for(int k=0;k<8;++k)  
  18.     {  
  19.         if(a[k]!=a[k+1==8?0:k+1])  
  20.         {  
  21.             ++cnt;  
  22.         }  
  23.     }  
  24.     return cnt;  
  25. }  
  26.   
  27. void lbp59table(uchar* table)  
  28. {  
  29.     memset(table,0,256);  
  30.     uchar temp=1;  
  31.     for(int i=0;i<256;++i)  
  32.     {  
  33.         if(getHopCount(i)<=2)  
  34.         {  
  35.             table[i]=temp;  
  36.             temp++;  
  37.         }  
  38.         // printf("%d\n",table[i]);  
  39.     }  
  40. }  
  41.   
  42. void LBP(IplImage* src, IplImage* dst)  
  43. {  
  44.     int width=src->width;  
  45.     int height=src->height;  
  46.     uchar table[256];  
  47.     lbp59table(table);  
  48.     for(int j=1;j<width-1;j++)  
  49.     {  
  50.         for(int i=1;i<height-1;i++)  
  51.         {  
  52.             uchar neighborhood[8]={0};  
  53.             neighborhood[7] = CV_IMAGE_ELEM( src, uchar, i-1, j-1);  
  54.             neighborhood[6] = CV_IMAGE_ELEM( src, uchar, i-1, j);  
  55.             neighborhood[5] = CV_IMAGE_ELEM( src, uchar, i-1, j+1);  
  56.             neighborhood[4] = CV_IMAGE_ELEM( src, uchar, i, j+1);  
  57.             neighborhood[3] = CV_IMAGE_ELEM( src, uchar, i+1, j+1);  
  58.             neighborhood[2] = CV_IMAGE_ELEM( src, uchar, i+1, j);  
  59.             neighborhood[1] = CV_IMAGE_ELEM( src, uchar, i+1, j-1);  
  60.             neighborhood[0] = CV_IMAGE_ELEM( src, uchar, i, j-1);  
  61.             uchar center = CV_IMAGE_ELEM( src, uchar, i, j);  
  62.             uchar temp=0;  
  63.   
  64.             for(int k=0;k<8;k++)  
  65.             {  
  66.                 temp+=(neighborhood[k]>=center)<<k;  
  67.             }  
  68.             //CV_IMAGE_ELEM( dst, uchar, i, j)=temp;  
  69.             CV_IMAGE_ELEM( dst, uchar, i, j)=table[temp];  
  70.         }  
  71.     }  
  72. }  
  73.   
  74. int main()  
  75. {  
  76.     IplImage* img=cvLoadImage("lena.jpg", 0);  
  77.     IplImage* dst=cvCreateImage(cvGetSize(img),8,1);  
  78.     LBP(img,dst);  
  79.     cvNamedWindow("图像", 1);  
  80.     cvShowImage("图像", dst);  
  81.     cvWaitKey(0);  
  82.     cvDestroyAllWindows();  
  83.     cvReleaseImage(&img);  
  84.     cvReleaseImage(&dst);  
  85.   
  86.     return 0;  
  87. }  
输出图像为:



图像特征提取总结

阅读数 42459