精华内容
下载资源
问答
  • 概念描述: GLSZM与GLRLM(gray-level run-length matrix)类似,GLRLM是在一维方向上记录连续jjj个像素值iii连续相邻情况出现次数,GLSZM是在二维区域内记录图像区域内有jjj个iii元素...

    纹理特征三:GLSZM–灰度区域大小矩阵

    1. GLSZM 的解释与计算

    GLSZM,全称gray-level size zone matrix,中文名称弧度区域大小矩阵。
    概念描述: GLSZM与GLRLM(gray-level run-length matrix)类似,GLRLM是在一维方向上记录连续jj个像素值ii连续相邻的情况的出现的次数,GLSZM是在二维区域内记录图像区域内有jjii元素相邻的情况的出现的次数。
    举例如下:
    下图来自网址:这里

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    2.GLRLM计算得到的纹理特征

    像素值(灰度值)为ii,连续相邻数jj,角度值(方向)为θ\thetap(i,jθ)p(i,j|\theta)为在θ\theta方向上连续jjii值的情况的个数或概率(用频率近似概率)。
    则有
    1.Short Zone Emphasis(SZE)
    SZE=ij[p(i,jj2]ijp(i,j)SZE=\frac{\sum_i\sum_j[\frac{p(i,j}{j^2}]}{\sum_i\sum_jp(i,j)}
    2.Long Zone Emphasis(LZE)
    LZE=ijj2p(i,j)ijp(i,j)LZE=\frac{\sum_i\sum_jj^2p(i,j)}{\sum_i\sum_jp(i,j)}
    3.Gray Level Non_Uniformity(GLN)
    GLN=i[jp(i,j)]2ijp(i,j)GLN=\frac{\sum_i[\sum_jp(i,j)]^2}{\sum_i\sum_jp(i,j)}
    4.Zone-Size Non_Uniformity(RLN)
    ZSN=j[ip(i,j)]2ijp(i,j)ZSN=\frac{\sum_j[\sum_ip(i,j) ]^2}{\sum_i\sum_jp(i,j)}
    5.Zone Percentage(ZP)
    ZP=ijp(i,j)NpZP=\sum_i\sum_j\frac{p(i,j)}{N_p}
                NpN_p是GLZSM中元素个数

    6.Low Gray Level Zone Emphasis(LGZE)
    LGZE=ij[p(i,j)i2]ijp(i,j)LGZE=\frac{\sum_i\sum_j[\frac{p(i,j)}{i^2}]}{\sum_i\sum_jp(i,j)}
    7.High Gray Level Zone Emphasis(HGZE)
    HGZE=iji2p(i,j)ijp(i,j)HGZE=\frac{\sum_i\sum_ji^2p(i,j)}{\sum_i\sum_jp(i,j)}

    8.Small Zone Low Gray Level Emphasis(SZLGLE)
    SZLGLE=ij[p(i,j)i2j2]ijp(i,j)SZLGLE=\frac{\sum_i\sum_j[\frac{p(i,j)}{i^2j^2}]}{\sum_i\sum_jp(i,j)}

    9.Small Run High Gray Level Emphasis(SZHGLE)
    SZHGLE=ij[i2p(i,j)j2]ijp(i,j)SZHGLE=\frac{\sum_i\sum_j[\frac{i^2p(i,j)}{j^2}]}{\sum_i\sum_jp(i,j)}
    10.Large Zone Low Gray Level Emphasis(LZLGLE)
    LZLGLE=ij[j2p(i,j)i2]ijp(i,j)LZLGLE=\frac{\sum_i\sum_j[\frac{j^2p(i,j)}{i^2}]}{\sum_i\sum_jp(i,j)}
    11.Large Zone High Gray Level Emphasis(LZHGLE)
    LZHGLE=iji2j2p(i,j)ijp(i,j)LZHGLE=\frac{\sum_i\sum_ji^2j^2p(i,j)}{\sum_i\sum_jp(i,j)}
    12.Gray-Level Variance (GLV)

    13.Run-Length Variance (RLV)

    !建议您同时阅读

    纹理特征一:GLCM—灰度共生矩阵
    纹理特征二:GLRLM–灰度行程矩阵
    纹理特征四:NGTDM–邻域灰度差矩阵

    展开全文
  • 图像特征提取三大法宝:HOG特征,LBP特征,Haar特征 一、HOG特征 1、HOG特征: 即局部归一化的梯度方向直方图,是一种对图像局部重叠区域的密集型描述符, 它通过计算局部区域的梯度方向直方图来构成特征。方向...

    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    一、HOG特征

    1、HOG特征:
    即局部归一化的梯度方向直方图,是一种对图像局部重叠区域的密集型描述符, 它通过计算局部区域的梯度方向直方图来构成特征。方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主。

    (1)主要思想:
    在一副图像中,局部目标的表象和形状(appearance and shape)能够被梯度或边缘的方向密度分布很好地描述。(本质:梯度的统计信息,而梯度主要存在于边缘的地方)。

    (2)具体的实现方法是:
    首先将图像分成小的连通区域,我们把它叫细胞单元。然后采集细胞单元中各像素点的梯度的或边缘的方向直方图。最后把这些直方图组合起来就可以构成特征描述器。

    (3)提高性能:
    把这些局部直方图在图像的更大的范围内(我们把它叫区间或block)进行对比度归一化(contrast-normalized),所采用的方法是:先计算各直方图在这个区间(block)中的密度,然后根据这个密度对区间中的各个细胞单元做归一化。通过这个归一化后,能对光照变化和阴影获得更好的效果。

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

    2、HOG特征提取算法的实现过程:
    大概过程:
    HOG特征提取方法就是将一个image(你要检测的目标或者扫描窗口):
    1)灰度化(将图像看做一个x,y,z(灰度)的三维图像);

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

    具体每一步的详细过程如下:
    (1)标准化gamma空间和颜色空间
    为了减少光照因素的影响,首先需要将整个图像进行规范化(归一化)。在图像的纹理强度中,局部的表层曝光贡献的比重较大,所以,这种压缩处理能够有效地降低图像局部的阴影和光照变化。因为颜色信息作用不大,通常先转化为灰度图;
    Gamma压缩公式:

    比如可以取Gamma=1/2;

    (2)计算图像梯度
    计算图像横坐标和纵坐标方向的梯度,并据此计算每个像素位置的梯度方向值;求导操作不仅能够捕获轮廓,人影和一些纹理信息,还能进一步弱化光照的影响。
    图像中像素点(x,y)的梯度为:

    最常用的方法是:首先用[-1,0,1]梯度算子对原图像做卷积运算,得到x方向(水平方向,以向右为正方向)的梯度分量gradscalx,然后用[1,0,-1]T梯度算子对原图像做卷积运算,得到y方向(竖直方向,以向上为正方向)的梯度分量gradscaly。然后再用以上公式计算该像素点的梯度大小和方向。

    (3)为每个细胞单元构建梯度方向直方图
    第三步的目的是为局部图像区域提供一个编码,同时能够保持对图像中人体对象的姿势和外观的弱敏感性。
    我们将图像分成若干个“单元格cell”,例如每个cell为6*6个像素。假设我们采用9个bin的直方图来统计这6*6个像素的梯度信息。也就是将cell的梯度方向360度分成9个方向块,如图所示:例如:如果这个像素的梯度方向是20-40度,直方图第2个bin的计数就加一,这样,对cell内每个像素用梯度方向在直方图中进行加权投影(映射到固定的角度范围),就可以得到这个cell的梯度方向直方图了,就是该cell对应的9维特征向量(因为有9个bin)。
    像素梯度方向用到了,那么梯度大小呢?梯度大小就是作为投影的权值的。例如说:这个像素的梯度方向是20-40度,然后它的梯度大小是2(假设啊),那么直方图第2个bin的计数就不是加一了,而是加二(假设啊)。

    细胞单元可以是矩形的(rectangular),也可以是星形的(radial)。

    (4)把细胞单元组合成大的块(block),块内归一化梯度直方图
    由于局部光照的变化以及前景-背景对比度的变化,使得梯度强度的变化范围非常大。这就需要对梯度强度做归一化。归一化能够进一步地对光照、阴影和边缘进行压缩。
    作者采取的办法是:把各个细胞单元组合成大的、空间上连通的区间(blocks)。这样,一个block内所有cell的特征向量串联起来便得到该block的HOG特征。这些区间是互有重叠的,这就意味着:每一个单元格的特征会以不同的结果多次出现在最后的特征向量中。我们将归一化之后的块描述符(向量)就称之为HOG描述符。

    区间有两个主要的几何形状——矩形区间(R-HOG)和环形区间(C-HOG)。R-HOG区间大体上是一些方形的格子,它可以有三个参数来表征:每个区间中细胞单元的数目、每个细胞单元中像素点的数目、每个细胞的直方图通道数目。
    例如:行人检测的最佳参数设置是:3×3细胞/区间、6×6像素/细胞、9个直方图通道。则一块的特征数为:3*3*9;

    (5)收集HOG特征
    最后一步就是将检测窗口中所有重叠的块进行HOG特征的收集,并将它们结合成最终的特征向量供分类使用。

    (6)那么一个图像的HOG特征维数是多少呢?
    顺便做个总结:Dalal提出的Hog特征提取的过程:把样本图像分割为若干个像素的单元(cell),把梯度方向平均划分为9个区间(bin),在每个单元里面对所有像素的梯度方向在各个方向区间进行直方图统计,得到一个9维的特征向量,每相邻的4个单元构成一个块(block),把一个块内的特征向量联起来得到36维的特征向量,用块对样本图像进行扫描,扫描步长为一个单元。最后将所有块的特征串联起来,就得到了人体的特征。例如,对于64*128的图像而言,每16*16的像素组成一个cell,每2*2个cell组成一个块,因为每个cell有9个特征,所以每个块内有4*9=36个特征,以8个像素为步长,那么,水平方向将有7个扫描窗口,垂直方向将有15个扫描窗口。也就是说,64*128的图片,总共有36*7*15=3780个特征。

    LBP特征

    Haar特征

    参考文章:http://dataunion.org/20584.html

    展开全文
  • 图像三大特征

    万次阅读 2016-10-30 21:59:01
    方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合 SVM分类器已经被...
     

    (一)HOG特征

    1、HOG特征:

    方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合 SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal 在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主。

    (1)主要思想:

    在一副图像中,局部目标的表象和形状(appearance and shape)能够被梯度或边缘的方向密度分布很好地描述。(本质:梯度的统计信息,而梯度主要存在于边缘的地方)。

    (2)具体的实现方法是:

    首先将图像分成小的连通区域,我们把它叫细胞单元。然后采集细胞单元中各像素点的梯度的或边缘的方向直方图。最后把这些直方图组合起来就可以构成特征描述器。

    (3)提高性能:

    把这些局部直方图在图像的更大的范围内(我们把它叫区间或block)进行对比度归一化(contrast-normalized),所采用的方 法是:先计算各直方图在这个区间(block)中的密度,然后根据这个密度对区间中的各个细胞单元做归一化。通过这个归一化后,能对光照变化和阴影获得更 好的效果。

    (4)优点:

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

    2、HOG特征提取算法的实现过程:

    大概过程:

    HOG特征提取方法就是将一个image(你要检测的目标或者扫描窗口):

    1)灰度化(将图像看做一个x,y,z(灰度)的三维图像);

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

      图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    具体每一步的详细过程如下:

    (1)标准化gamma空间和颜色空间

    为了减少光照因素的影响,首先需要将整个图像进行规范化(归一化)。在图像的纹理强度中,局部的表层曝光贡献的比重较大,所以,这种压缩处理能够有效地降低图像局部的阴影和光照变化。因为颜色信息作用不大,通常先转化为灰度图;

    Gamma压缩公式:

    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    比如可以取Gamma=1/2;


    (2)计算图像梯度

    计算图像横坐标和纵坐标方向的梯度,并据此计算每个像素位置的梯度方向值;求导操作不仅能够捕获轮廓,人影和一些纹理信息,还能进一步弱化光照的影响。

    图像中像素点(x,y)的梯度为:

    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    最常用的方法是:首先用[-1,0,1]梯度算子对原图像做卷积运算,得到x方向(水平方向,以向右为正方向)的梯度分量gradscalx,然后用[1,0,-1] T 梯度算子对原图像做卷积运算,得到y方向(竖直方向,以向上为正方向)的梯度分量gradscaly。然后再用以上公式计算该像素点的梯度大小和方向。

    (3)为每个细胞单元构建梯度方向直方图

    第三步的目的是为局部图像区域提供一个编码,同时能够保持对图像中人体对象的姿势和外观的弱敏感性。

    我们将图像分成若干个“单元格cell”,例如每个cell为6*6个像素。假设我们采用9个bin的直方图来统计这6*6个像素的梯度信息。也 就是将cell的梯度方向360度分成9个方向块,如图所示:例如:如果这个像素的梯度方向是20-40度,直方图第2个bin的计数就加一,这样,对 cell内每个像素用梯度方向在直方图中进行加权投影(映射到固定的角度范围),就可以得到这个cell的梯度方向直方图了,就是该cell对应的9维特 征向量(因为有9个bin)。

    像素梯度方向用到了,那么梯度大小呢?梯度大小就是作为投影的权值的。例如说:这个像素的梯度方向是20-40度,然后它的梯度大小是2(假设啊),那么直方图第2个bin的计数就不是加一了,而是加二(假设啊)。

    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    细胞单元可以是矩形的(rectangular),也可以是星形的(radial)。

    (4)把细胞单元组合成大的块(block),块内归一化梯度直方图

    由于局部光照的变化以及前景-背景对比度的变化,使得梯度强度的变化范围非常大。这就需要对梯度强度做归一化。归一化能够进一步地对光照、阴影和边缘进行压缩。

    作者采取的办法是:把各个细胞单元组合成大的、空间上连通的区间(blocks)。这样,一个block内所有cell的特征向量串联起来便得到 该block的HOG特征。这些区间是互有重叠的,这就意味着:每一个单元格的特征会以不同的结果多次出现在最后的特征向量中。我们将归一化之后的块描述 符(向量)就称之为HOG描述符。

    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    区间有两个主要的几何形状——矩形区间(R-HOG)和环形区间(C-HOG)。R-HOG区间大体上是一些方形的格子,它可以有三个参数来表征:每个区间中细胞单元的数目、每个细胞单元中像素点的数目、每个细胞的直方图通道数目。

    例如:行人检测的最佳参数设置是:3×3细胞/区间、6×6像素/细胞、9个直方图通道。则一块的特征数为:3*3*9;

    (5)收集HOG特征

    最后一步就是将检测窗口中所有重叠的块进行HOG特征的收集,并将它们结合成最终的特征向量供分类使用。

    (6)那么一个图像的HOG特征维数是多少呢?

    顺便做个总结:Dalal提出的Hog特征提取的过程:把样本图像分割为若干个像素的单元(cell),把梯度方向平均划分为9个区间 (bin),在每个单元里面对所有像素的梯度方向在各个方向区间进行直方图统计,得到一个9维的特征向量,每相邻的4个单元构成一个块(block),把 一个块内的特征向量联起来得到36维的特征向量,用块对样本图像进行扫描,扫描步长为一个单元。最后将所有块的特征串联起来,就得到了人体的特征。例如, 对于64*128的图像而言,每16*16的像素组成一个cell,每2*2个cell组成一个块,因为每个cell有9个特征,所以每个块内有 4*9=36个特征,以8个像素为步长,那么,水平方向将有7个扫描窗口,垂直方向将有15个扫描窗口。也就是说,64*128的图片,总共有 36*7*15=3780个特征。

    (二)LBP特征

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

    1、LBP特征的描述

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

    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    LBP的改进版本:

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

    (1)圆形LBP算子:

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

    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    (2)LBP旋转不变模式

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

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

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

    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    (3)LBP等价模式

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

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

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

    2、LBP特征用于检测的原理

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

    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    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或者其他机器学习算法进行分类了。

    (三)Haar特征

    1、Haar-like特征

    Haar-like特征最早是由Papageorgiou等应用于人脸表示,Viola和Jones在此基础上,使用3种类型4种形式的特征。

    Haar特征分为三类:边缘特征、线性特征、中心特征和对角线特征,组合成特征模板。特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白 色矩形像素和减去黑色矩形像素和。Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻 梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述特定走向(水平、垂直、对角)的结 构。

    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    对于图中的A, B和D这类特征,特征数值计算公式为:v=Sum白-Sum黑,而对于C来说,计算公式如下:v=Sum白-2*Sum黑;之所以将黑色区域像素和乘以2,是为了使两种矩形区域中像素数目一致。

    通过改变特征模板的大小和位置,可在图像子窗口中穷举出大量的特征。上图的特征模板称为“特征原型”;特征原型在图像子窗口中扩展(平移伸缩)得到的特征称为“矩形特征”;矩形特征的值称为“特征值”。

    矩形特征可位于图像任意位置,大小也可以任意改变,所以矩形特征值是矩形模版类别、矩形位置和矩形大小这三个因素的函数。故类别、大小和位置的变化,使得 很小的检测窗口含有非常多的矩形特征,如:在24*24像素大小的检测窗口内矩形特征数量可以达到16万个。这样就有两个问题需要解决了:(1)如何快速 计算那么多的特征?—积分图大显神通;(2)哪些矩形特征才是对分类器分类最有效的?—如通过AdaBoost算法来训练(这一块这里不讨论,具体见 http://blog.csdn.net/zouxy09/article/details/7922923

    2、Haar-like特征的计算—积分图

    积分图就是只遍历一次图像就可以求出图像中所有区域像素和的快速算法,大大的提高了图像特征值计算的效率。

    积分图主要的思想是将图像从起点开始到各个点所形成的矩形区域像素之和作为一个数组的元素保存在内存中,当要计算某个区域的像素和时可以直接索引 数组的元素,不用重新计算这个区域的像素和,从而加快了计算(这有个相应的称呼,叫做动态规划算法)。积分图能够在多种尺度下,使用相同的时间(常数时 间)来计算不同的特征,因此大大提高了检测速度。

    我们来看看它是怎么做到的。

    积分图是一种能够描述全局信息的矩阵表示方法。积分图的构造方式是位置(i,j)处的值ii(i,j)是原图像(i,j)左上角方向所有像素的和:

    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    积分图构建算法:

    1)用s(i,j)表示行方向的累加和,初始化s(i,-1)=0;

    2)用ii(i,j)表示一个积分图像,初始化ii(-1,i)=0;

    3)逐行扫描图像,递归计算每个像素(i,j)行方向的累加和s(i,j)和积分图像ii(i,j)的值

    s(i,j)=s(i,j-1)+f(i,j)

    ii(i,j)=ii(i-1,j)+s(i,j)

    4)扫描图像一遍,当到达图像右下角像素时,积分图像ii就构造好了。

    积分图构造好之后,图像中任何矩阵区域的像素累加和都可以通过简单运算得到如图所示。

    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    设D的四个顶点分别为α、β、γ、δ,则D的像素和可以表示为

    Dsum = ii( α )+ii( β)-(ii( γ)+ii( δ ));

    而Haar-like特征值无非就是两个矩阵像素和的差,同样可以在常数时间内完成。所以矩形特征的特征值计算,只与此特征矩形的端点的积分图有 关,所以不管此特征矩形的尺度变换如何,特征值的计算所消耗的时间都是常量。这样只要遍历图像一次,就可以求得所有子窗口的特征值。

    3、Haar-like矩形特征拓展

    Lienhart R.等对Haar-like矩形特征库作了进一步扩展,加入了旋转45 角的矩形特征。扩展后的特征大致分为4种类型:边缘特征、线特征环、中心环绕特征和对角线特征:

    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

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

    竖直矩阵特征值计算:

    对于竖直矩阵,与上面2处说的一样。

    45°旋角的矩形特征计算:

    对于45°旋角的矩形,我们定义RSAT(x,y)为点(x,y)左上角45°区域和左下角45°区域的像素和。

    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    用公式可以表示为:

    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    为了节约时间,减少重复计算,可按如下递推公式计算:

    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    而计算矩阵特征的特征值,是位于十字行矩形RSAT(x,y)之差。可参考下图:

    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    展开全文
  • 接下来就是面向对象的三大特征 封装 、 继承 、 多态 一.封装 上节课讲过了封装,这里简单的复习下 1.含义 封装是对全局作用域中其它区域隐藏多余信息的原则。 2.实例 如果要让内部属性不被外部访问,可以把属性的.....

    看到一篇博客,觉的特别好理解,就转来分享一下:
    原文章网址:https://blog.csdn.net/weixin_40313627/article/details/80783277
    接下来就是面向对象的三大特征
    封装 、 继承 、 多态
    一.封装
    上节课讲过了封装,这里简单的复习下

    1.含义
    封装是对全局作用域中其它区域隐藏多余信息的原则。
    2.实例
    如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。
    代码如下:

    class Student(object):

    def __init__(self, name, score):
        self.__name = name
        self.__score = score
    
    def print_score(self):
        print('%s: %s' % (self.__name, self.__score))
    

    1
    2
    3
    4
    5
    6
    7
    8
    改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量.__name和实例变量.__score了。
    这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。
    但是如果外部代码要获取name和score怎么办?可以给Student类增加get_name和get_score这样的方法:

    class Student(object):
    #这里的代码和上面一样,定义两个私有属性__name和__score

    def get_name(self):
        return self.__name
    
    def get_score(self):
        return self.__score
    

    1
    2
    3
    4
    5
    6
    7
    8
    9
    如果又要允许外部代码修改score怎么办?可以再给Student类增加set_score方法:

    class Student(object):
    #代码同上

    def set_score(self, score):
        self.__score = score
    

    1
    2
    3
    4
    5
    6
    需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名。
    有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。

    二.继承
    1.什么是继承
    我们不想把同一段代码写好几次,之前使用的函数避免了这种情况。但现在又有个更微妙的问题。如果已经有了一个类,又想建立一个非常类似的类,只是添加几个方法。
    比如有人类,我们又想在人类的基础上建立学生类、医生类,教师类。因为他们都具有共同的属性和方法,比如都有 姓名 、年龄 、性别 等共同属性,还有吃饭、睡觉等共同方法。我们就可以写一个人类作为父类,包括姓名、年龄、性别等属性和吃饭睡觉等方法。然后再写多个子类继承父类的这些属性和方法。
    但需要注意的是,父类的私有属性和方法不会被子类继承
    话不多说,直接上代码:

    #父类
    class Person():
    def init(self,name=None,age=None,sex=None):
    self.name=name
    self.age=age
    self.sex=sex
    def eat(self):
    print("%s正在吃饭"%self.name)

    #学生子类:继承人类父类的属性
    class Student(Person):
    #子类的初始化参数要和父类的一样,否则没有办法给父类传参,会报错
    def init(self,name=None,age=None,sex=None,score=None):
    # self.name=name
    # self.age=age
    # self.sex=sex
    #上面三行的代码等价于下面一行的代码,都是给父类的属性传参
    Person.init(self,name,age,sex)
    #还可以这样写
    #super().init(name,age,sex)
    self.score=score
    #这个可以是子类独有的方法,不会影响到父类
    def study(self):
    self.eat()
    print("%s在学习,考了%d分"%(self.name,self.score))
    #实例化一个学生对象,然后可以调用子类的方法,也可以直接调用父类的方法
    stu=Student(“汤姆”,20,“男”,80)
    stu.study()
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    以上代码运行结果为:
    汤姆正在吃饭
    汤姆在学习,考了80分

    2.有了继承,我们可以实现子类对父类方法的重写
    子类继承父类时,子类的方法签名和父类一样,此时子类重写了父类的方法,当生成子类对象时,调用的是子类重写的方法。
    下面上代码:

    #父类
    class Person():
    def init(self,name=None,age=None,sex=None):
    self.name=name
    self.age=age
    self.sex=sex
    def eat(self):
    print("%s正在吃饭"%self.name)

    #学生子类:继承人类父类的属性
    class Student(Person):
    def init(self,name=None,age=None,sex=None,score=None):
    # self.name=name
    # self.age=age
    # self.sex=sex
    #Person.init(self,name,age,sex)
    super().init(name,age,sex)
    self.score=score
    def study(self):
    self.eat()
    print("%s在学习,考了%d分"%(self.name,self.score))
    #方法的重写,调用的时候调用子类的方法
    #可以对自定义的方法进行重写
    def eat(self):
    print("%d的%s正在吃饭,他是%s的"%(self.age,self.name,self.sex))
    #也可以对自带的object类的方法进行重写。
    def str(self):
    return “姓名:{0},年龄:{1},性别:{2},成绩:{3}”.format(self.name,self.age,self.sex,self.score)
    def lt(self,other):
    “”" if isinstance(other,Student):
    return self.age<other.age
    else:
    return False “”"
    if self.name==other.name:
    return self.age<other.age
    else:
    return self.name<other.name
    #实例化
    stu=Student(“汤姆”,20,“男”,80)
    stu.study()
    stu.eat()
    list1=[]
    stu1=Student(“杰克”,20,“男”,90)
    stu2=Student(“杰森”,21,“男”,20)
    stu3=Student(“杰森”,12,“女”,50)
    list1.append(stu)
    list1.append(stu1)
    list1.append(stu2)
    list1.append(stu3)
    for student in list1:
    print(student)
    list1.sort()
    for student in list1:
    print(student)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    以上代码输出为:
    20的汤姆正在吃饭,他是男的
    汤姆在学习,考了80分
    20的汤姆正在吃饭,他是男的
    姓名:汤姆,年龄:20,性别:男,成绩:80
    姓名:杰克,年龄:20,性别:男,成绩:90
    姓名:杰森,年龄:21,性别:男,成绩:20
    姓名:杰森,年龄:12,性别:女,成绩:50
    姓名:杰克,年龄:20,性别:男,成绩:90
    姓名:杰森,年龄:12,性别:女,成绩:50
    姓名:杰森,年龄:21,性别:男,成绩:20
    姓名:汤姆,年龄:20,性别:男,成绩:80
    如上,我们对自定义的eat()方法进行了重写,也对

    3.多继承
    一个类可以继承多个父类。

    class A:
    def init(self,a=None):
    self.a=a
    def test(self):
    print(“A…test”)
    class B:
    def init(self,b=None):
    self.b=b
    def test(self):
    print(“B…test”)
    class C(B,A):
    def init(self,a):
    A.init(self,a)
    def t(self):
    A.test(self)#调用A的test()
    super().test()#这个调用的也是B的test
    print(“C…t”)
    c=C(“aa”)
    #默认调用的是父类B的test方法,因为在class C(B,A),B在A前面
    c.test()
    c.t()
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    以上实例输出结果为:
    B…test
    A…test
    B…test
    C…t
    class C(B,A),当有AB均有相同方法,而子类又重写时,调用子类的方法,如果子类没有方法,则调用在继承时写在前面的父类的方法(这里也就是B)。

    三.多态
    1.什么是多态?
    当子类和父类都存在相同的方法时,我们说,子类的方法覆盖了父类的方法,在代码运行的时候,总是会调用子类的方法。这样,我们就获得了继承的另一个好处:多态。
    2.多态的实例
    简单工厂模式就是典型的多态体现:

    让用户输入要选择的汉堡,他不需要知道内部是如何制作的,只要得到一个选择的汉堡实例对象就可以

    #创建汉堡的父类,并根据父类创建几个子类
    class Hamburger:
    def make(self):
    print(“您没有正确选择要制作的汉堡,请重新输入”)
    class FishHamburger(Hamburger):
    def make(self):
    print(“您的鱼肉汉堡已经制作好了”)
    class BeafHamburger(Hamburger):
    def make(self):
    print(“您的牛肉汉堡已经制作好了”)
    class ChickenHamburger(Hamburger):
    def make(self):
    print(“您的鸡肉汉堡已经制作好了”)
    #工厂类,用来判断用户输入的值并创建相应的对象
    class HamburgerFactory:
    @classmethod
    def getinput(cls,temp):
    if temp==“1”:
    ch=FishHamburger()
    elif temp==“2”:
    ch=BeafHamburger()
    elif temp==“3”:
    ch=ChickenHamburger()
    else:
    ch=Hamburger()
    return ch
    #主方法,通过用户输入的值调用工厂的类方法
    while True:
    temp=input(“请输入您要制作汉堡的序号,1.鱼肉汉堡,2.牛肉汉堡,3.鸡肉汉堡”)
    if temp==“1” or temp==“2” or temp==“3”:
    ch=HamburgerFactory.getinput(temp)
    ch.make()
    break
    else:
    ch=Hamburger()
    ch.make()
    continue

    展开全文
  • 它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极的成功。需要提醒的是,HOG+SVM进行行人检测的方法是法国
  • 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被...
  • 它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog 特征结合 SVM 分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极的成功。需要提醒的是,HOG+SVM 进行行人检测的方法是法...
  • 图像特征提取三大法宝:HOG特征、LBP特征、Haar-like特征 2016年10月07日 12:19:33 阅读数:25810 (一)HOG特征 1、HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉...
  • 它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极的成功。需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 599
精华内容 239
关键字:

区域的三大特征是