2017-12-26 22:37:11 mumianyuxin 阅读数 97

图像特征提取之HOG

参考自http://blog.csdn.net/liulina603/article/details/8291093

  • HOG特征:方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。
    • 主要思想:在一幅图像中,局部目标的表象和形状(Appearance and shape)能够被梯度或边缘的方向密度分布很好的描述。HOG提取的是梯度的统计信息。
    • 实现方法:首先将图像分成小的连通区域,我们把它叫做细胞单元。然后采集细胞单元中各像素点的梯度的或边缘的方向直方图。然后把这些直方图组合起来,构成特征描述器。
    • 算法过程:
      • 灰度化
      • 采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);目的是调节图像的对比度,降低图像局部的阴影和光照变化带来的影响,同时也一直噪音的干扰。
      • 计算图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰。
      • 将图像划分成小cells(例如6*6 pixl/cell)。
      • 统计每个cell的梯度直方图(不同梯度的个数,即可形成每个cell的descriptor)。
      • 将每几个cell组成一个block(例如3*3),一个block内所有cell的特征description串联起来便得到该block的HOG特征descriptor。
      • 将图像内所有block的HOG特征descriptor串联起来就可以得到图像的HOG特征描述子,用于后面的分类。
2019-06-13 08:52:39 qq_19600291 阅读数 1675

原文链接:http://tecdat.cn/?p=9015

 

在本文中,我将带您了解图像处理的一些基本功能。特征提取。但是这里我们需要更深入的数据清理。但是数据清理是在数据集,表格,文本等上完成的。如何在图像上完成?

导入图像

用python导入图像很容易。以下代码将帮助您在Python上导入图像:

image = imread(r"C:\Users\Tavish\Desktop\7.jpg")
show_img(image)

 

了解基础数据

该图像具有多种颜色和许多像素。为了可视化该图像的存储方式, 将每个像素视为矩阵中的一个单元。现在,该单元格包含三种不同的强度信息,分别对应于红色,绿色和蓝色。因此,RGB图像变为3-D矩阵。 

red, yellow =   image.copy(), image.copy()
red[:,:,(1,2)] = 0
yellow[:,:,2]=0
show_images(images=[red,yellow], titles=['Red Intensity','Yellow Intensity'])

 

 

将图像转换为二维矩阵

 在特征提取中,如果将图像压缩为二维矩阵,则变得更加简单。这是通过灰度或二值化完成的。 

这是将RGB图像转换为灰度的方法:

 

 

现在,让我们尝试对该灰度图像进行二值化处理。这是通过找到阈值并标记灰度像素来完成的。在本文中,我使用了Otsu的方法来找到阈值。 

 

模糊影像

我们将在本文中介绍的最后一部分与特征提取更相关:图像模糊。灰度或二进制图像有时会捕获比所需图像更多的图像,在这种情况下模糊处理非常方便。 

 

在上面的图片中,经过模糊处理后,我们可以清楚地看到鞋子现在已达到与铁路轨道相同的强度水平。因此,该技术在很多图像处理场景中非常方便。

 

2017-02-19 11:15:27 zhuquan945 阅读数 1725
特征提取是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征。特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者连续的区域。 

特征的定义 

        至今为止特征没有万能和精确的定义。特征的精确定义往往由问题或者应用类型决定。特征是一个数字图像中“有趣”的部分,它是许多计算机图像分析算法的起点。因此一个算法是否成功往往由它使用和定义的特征决定。因此特征提取最重要的一个特性是“可重复性”:同一场景的不同图像所提取的特征应该是相同的。 

        特征提取是图象处理中的一个初级运算,也就是说它是对一个图像进行的第一个运算处理。它检查每个像素来确定该像素是否代表一个特征。假如它是一个更大的算法的一部分,那么这个算法一般只检查图像的特征区域。作为特征提取的一个前提运算,输入图像一般通过高斯模糊核在尺度空间中被平滑。此后通过局部导数运算来计算图像的一个或多个特征。 

       有时,假如特征提取需要许多的计算时间,而可以使用的时间有限制,一个高层次算法可以用来控制特征提取阶层,这样仅图像的部分被用来寻找特征。 

        由于许多计算机图像算法使用特征提取作为其初级计算步骤,因此有大量特征提取算法被发展,其提取的特征各种各样,它们的计算复杂性和可重复性也非常不同。 


边缘 
        边缘是组成两个图像区域之间边界(或边缘)的像素。一般一个边缘的形状可以是任意的,还可能包括交叉点。在实践中边缘一般被定义为图像中拥有大的梯度的点组成的子集。一些常用的算法还会把梯度高的点联系起来来构成一个更完善的边缘的描写。这些算法也可能对边缘提出一些限制。 

局部地看边缘是一维结构。 


角 
        角是图像中点似的特征,在局部它有两维结构。早期的算法首先进行边缘检测,然后分析边缘的走向来寻找边缘突然转向(角)。后来发展的算法不再需要边缘检测这个步骤,而是可以直接在图像梯度中寻找高度曲率。后来发现这样有时可以在图像中本来没有角的地方发现具有同角一样的特征的区域。 


区域 
       与角不同的是区域描写一个图像中的一个区域性的结构,但是区域也可能仅由一个像素组成,因此许多区域检测也可以用来监测角。一个区域监测器检测图像中一个对于角监测器来说太平滑的区域。区域检测可以被想象为把一张图像缩小,然后在缩小的图像上进行角检测。 


脊 
        长条形的物体被称为脊。在实践中脊可以被看作是代表对称轴的一维曲线,此外局部针对于每个脊像素有一个脊宽度。从灰梯度图像中提取脊要比提取边缘、角和区域困难。在空中摄影中往往使用脊检测来分辨道路,在医学图像中它被用来分辨血管。 


特征抽取 
        特征被检测后它可以从图像中被抽取出来。这个过程可能需要许多图像处理的计算机。其结果被称为特征描述或者特征向量。 


常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。 

一 颜色特征 

(一)特点:颜色特征是一种全局特征,描述了图像或图像区域所对应的景物的表面性质。一般颜色特征是基于像素点的特征,此时所有属于图像或图像区域的像素都有各自的贡献。由于颜色对图像或图像区域的方向、大小等变化不敏感,所以颜色特征不能很好地捕捉图像中对象的局部特征。另外,仅使用颜色特征查询时,如果数据库很大,常会将许多不需要的图像也检索出来。颜色直方图是最常用的表达颜色特征的方法,其优点是不受图像旋转和平移变化的影响,进一步借助归一化还可不受图像尺度变化的影响,基缺点是没有表达出颜色空间分布的信息。 

(二)常用的特征提取与匹配方法 

(1) 颜色直方图 

        其优点在于:它能简单描述一幅图像中颜色的全局分布,即不同色彩在整幅图像中所占的比例,特别适用于描述那些难以自动分割的图像和不需要考虑物体空间位置的图像。其缺点在于:它无法描述图像中颜色的局部分布及每种色彩所处的空间位置,即无法描述图像中的某一具体的对象或物体。 

         最常用的颜色空间:RGB颜色空间、HSV颜色空间。 

         颜色直方图特征匹配方法:直方图相交法、距离法、中心距法、参考颜色表法、累加颜色直方图法。 

(2) 颜色集 

        颜色直方图法是一种全局颜色特征提取与匹配方法,无法区分局部颜色信息。颜色集是对颜色直方图的一种近似首先将图像从 RGB颜色空间转化成视觉均衡的颜色空间(如 HSV 空间),并将颜色空间量化成若干个柄。然后,用色彩自动分割技术将图像分为若干区域,每个区域用量化颜色空间的某个颜色分量来索引,从而将图像表达为一个二进制的颜色索引集。在图像匹配中,比较不同图像颜色集之间的距离和色彩区域的空间关系 

(3) 颜色矩 

        这种方法的数学基础在于:图像中任何的颜色分布均可以用它的矩来表示。此外,由于颜色分布信息主要集中在低阶矩中,因此,仅采用颜色的一阶矩(mean)、二阶矩(variance)和三阶矩(skewness)就足以表达图像的颜色分布。 

(4) 颜色聚合向量 

        其核心思想是:将属于直方图每一个柄的像素分成两部分,如果该柄内的某些像素所占据的连续区域的面积大于给定的阈值,则该区域内的像素作为聚合像素,否则作为非聚合像素。 

(5) 颜色相关图 

二 纹理特征 

(一)特点:纹理特征也是一种全局特征,它也描述了图像或图像区域所对应景物的表面性质。但由于纹理只是一种物体表面的特性,并不能完全反映出物体的本质属性,所以仅仅利用纹理特征是无法获得高层次图像内容的。与颜色特征不同,纹理特征不是基于像素点的特征,它需要在包含多个像素点的区域中进行统计计算。在模式匹配中,这种区域性的特征具有较大的优越性,不会由于局部的偏差而无法匹配成功。作为一种统计特征,纹理特征常具有旋转不变性,并且对于噪声有较强的抵抗能力。但是,纹理特征也有其缺点,一个很明显的缺点是当图像的分辨率变化的时候,所计算出来的纹理可能会有较大偏差。另外,由于有可能受到光照、反射情况的影响,从2-D图像中反映出来的纹理不一定是3-D物体表面真实的纹理。 

        例如,水中的倒影,光滑的金属面互相反射造成的影响等都会导致纹理的变化。由于这些不是物体本身的特性,因而将纹理信息应用于检索时,有时这些虚假的纹理会对检索造成“误导”。 

        在检索具有粗细、疏密等方面较大差别的纹理图像时,利用纹理特征是一种有效的方法。但当纹理之间的粗细、疏密等易于分辨的信息之间相差不大的时候,通常的纹理特征很难准确地反映出人的视觉感觉不同的纹理之间的差别。 

(二)常用的特征提取与匹配方法 

  纹理特征描述方法分类 

(1)统计方法统计方法的典型代表是一种称为灰度共生矩阵的纹理特征分析方法Gotlieb 和 Kreyszig 等人在研究共生矩阵中各种统计特征基础上,通过实验,得出灰度共生矩阵的四个关键特征:能量、惯量、熵和相关性。统计方法中另一种典型方法,则是从图像的自相关函数(即图像的能量谱函数)提取纹理特征,即通过对图像的能量谱函数的计算,提取纹理的粗细度及方向性等特征参数 

(2)几何法 

        所谓几何法,是建立在纹理基元(基本的纹理元素)理论基础上的一种纹理特征分析方法。纹理基元理论认为,复杂的纹理可以由若干简单的纹理基元以一定的有规律的形式重复排列构成。在几何法中,比较有影响的算法有两种:Voronio 棋盘格特征法和结构法。 

(3)模型法 

        模型法以图像的构造模型为基础,采用模型的参数作为纹理特征。典型的方法是随机场模型法,如马尔可夫(Markov)随机场(MRF)模型法和 Gibbs 随机场模型法 

(4)信号处理法 

        纹理特征的提取与匹配主要有:灰度共生矩阵、Tamura 纹理特征、自回归纹理模型、小波变换等。 

        灰度共生矩阵特征提取与匹配主要依赖于能量、惯量、熵和相关性四个参数。Tamura 纹理特征基于人类对纹理的视觉感知心理学研究,提出6种属性,即:粗糙度、对比度、方向度、线像度、规整度和粗略度。自回归纹理模型(simultaneous auto-regressive, SAR)是马尔可夫随机场(MRF)模型的一种应用实例。 

三 形状特征 

(一)特点:各种基于形状特征的检索方法都可以比较有效地利用图像中感兴趣的目标来进行检索,但它们也有一些共同的问题,包括:①目前基于形状的检索方法还缺乏比较完善的数学模型;②如果目标有变形时检索结果往往不太可靠;③许多形状特征仅描述了目标局部的性质,要全面描述目标常对计算时间和存储量有较高的要求;④许多形状特征所反映的目标形状信息与人的直观感觉不完全一致,或者说,特征空间的相似性与人视觉系统感受到的相似性有差别。另外,从 2-D 图像中表现的 3-D 物体实际上只是物体在空间某一平面的投影,从 2-D 图像中反映出来的形状常不是 3-D 物体真实的形状,由于视点的变化,可能会产生各种失真。 

(二)常用的特征提取与匹配方法 

Ⅰ几种典型的形状特征描述方法 

        通常情况下,形状特征有两类表示方法,一类是轮廓特征,另一类是区域特征。图像的轮廓特征主要针对物体的外边界,而图像的区域特征则关系到整个形状区域。 

几种典型的形状特征描述方法: 

(1)边界特征法该方法通过对边界特征的描述来获取图像的形状参数。其中Hough 变换检测平行直线方法和边界方向直方图方法是经典方法。Hough 变换是利用图像全局特性而将边缘像素连接起来组成区域封闭边界的一种方法,其基本思想是点—线的对偶性;边界方向直方图法首先微分图像求得图像边缘,然后,做出关于边缘大小和方向的直方图,通常的方法是构造图像灰度梯度方向矩阵。 

(2)傅里叶形状描述符法 

        傅里叶形状描述符(Fourier shape deors)基本思想是用物体边界的傅里叶变换作为形状描述,利用区域边界的封闭性和周期性,将二维问题转化为一维问题。 

        由边界点导出三种形状表达,分别是曲率函数、质心距离、复坐标函数。 

(3)几何参数法 

        形状的表达和匹配采用更为简单的区域特征描述方法,例如采用有关形状定量测度(如矩、面积、周长等)的形状参数法(shape factor)。在 QBIC 系统中,便是利用圆度、偏心率、主轴方向和代数不变矩等几何参数,进行基于形状特征的图像检索。 

        需要说明的是,形状参数的提取,必须以图像处理及图像分割为前提,参数的准确性必然受到分割效果的影响,对分割效果很差的图像,形状参数甚至无法提取。 

(4)形状不变矩法 

利用目标所占区域的矩作为形状描述参数。 

(5)其它方法 

        近年来,在形状的表示和匹配方面的工作还包括有限元法(Finite Element Method 或 FEM)、旋转函数(Turning )和小波描述符(Wavelet Deor)等方法。 

Ⅱ 基于小波和相对矩的形状特征提取与匹配 

        该方法先用小波变换模极大值得到多尺度边缘图像,然后计算每一尺度的 7个不变矩,再转化为 10 个相对矩,将所有尺度上的相对矩作为图像特征向量,从而统一了区域和封闭、不封闭结构。 

四 空间关系特征 

(一)特点:所谓空间关系,是指图像中分割出来的多个目标之间的相互的空间位置或相对方向关系,这些关系也可分为连接/邻接关系、交叠/重叠关系和包含/包容关系等。通常空间位置信息可以分为两类:相对空间位置信息和绝对空间位置信息。前一种关系强调的是目标之间的相对情况,如上下左右关系等,后一种关系强调的是目标之间的距离大小以及方位。显而易见,由绝对空间位置可推出相对空间位置,但表达相对空间位置信息常比较简单。 

        空间关系特征的使用可加强对图像内容的描述区分能力,但空间关系特征常对图像或目标的旋转、反转、尺度变化等比较敏感。另外,实际应用中,仅仅利用空间信息往往是不够的,不能有效准确地表达场景信息。为了检索,除使用空间关系特征外,还需要其它特征来配合。 

(二)常用的特征提取与匹配方法 

        提取图像空间关系特征可以有两种方法:一种方法是首先对图像进行自动分割,划分出图像中所包含的对象或颜色区域,然后根据这些区域提取图像特征,并建立索引;另一种方法则简单地将图像均匀地划分为若干规则子块,然后对每个图像子块提取特征,并建立索引。 
姿态估计问题就是:确定某一三维目标物体的方位指向问题。姿态估计在机器人视觉、动作跟踪和单照相机定标等很多领域都有应用。 

        在不同领域用于姿态估计的传感器是不一样的,在这里主要讲基于视觉的姿态估计。 

        基于视觉的姿态估计根据使用的摄像机数目又可分为单目视觉姿态估计和多目视觉姿态估计。根据算法的不同又可分为基于模型的姿态估计和基于学习的姿态估计。 

一基于模型的姿态估计方法 

        基于模型的方法通常利用物体的几何关系或者物体的特征点来估计。其基本思想是利用某种几何模型或结构来表示物体的结构和形状,并通过提取某些物体特征,在模型和图像之间建立起对应关系,然后通过几何或者其它方法实现物体空间姿态的估计。这里所使用的模型既可能是简单的几何形体,如平面、圆柱,也可能是某种几何结构,也可能是通过激光扫描或其它方法获得的三维模型。 

        基于模型的姿态估计方法是通过比对真实图像和合成图像,进行相似度计算更新物体姿态。目前基于模型的方法为了避免在全局状态空间中进行优化搜索,一般都将优化问题先降解成多个局部特征的匹配问题,非常依赖于局部特征的准确检测。当噪声较大无法提取准确的局部特征的时候,该方法的鲁棒性受到很大影响。 

二基于学习的姿态估计方法 

        基于学习的方法借助于机器学习(machine learning)方法,从事先获取的不同姿态下的训练样本中学习二维观测与三维姿态之间的对应关系,并将学习得到的决策规则或回归函数应用于样本,所得结果作为对样本的姿态估计。基于学习的方法一般采用全局观测特征,不需检测或识别物体的局部特征,具有较好的鲁棒性。其缺点是由于无法获取在高维空间中进行连续估计所需要的密集采样,因此无法保证姿态估计的精度与连续性。 

        基于学习的姿态估计方法源于姿态识别方法的思想。姿态识别需要预先定义多个姿态类别,每个类别包含了一定的姿态范围;然后为每个姿态类别标注若干训练样本,通过模式分类的方法训练姿态分类器以实现姿态识别。 

        这一类方法并不需要对物体进行建模,一般通过图像的全局特征进行匹配分析,可以有效的避免局部特征方法在复杂姿态和遮挡关系情况下出现的特征匹配歧义性问题。然而姿态识别方法只能将姿态划分到事先定义的几个姿态类别中,并不能对姿态进行连续的精确的估计。 

        基于学习的方法一般采用全局观测特征,可以保证算法具有较好的鲁棒性。然而这一类方法的姿态估计精度很大程度依赖于训练的充分程度。要想比较精确地得到二维观测与三维姿态之间的对应关系,就必须获取足够密集的样本来学习决策规则和回归函数。而一般来说所需要样本的数量是随状态空间的维度指数级增加的,对于高维状态空间,事实上不可能获取进行精确估计所需要的密集采样。因此,无法得到密集采样而难以保证估计的精度与连续性,是基于学习的姿态估计方法无法克服的根本困难。 

        和姿态识别等典型的模式分类问题不同的是,姿态估计输出的是一个高维的姿态向量,而不是某个类别的类标。因此这一类方法需要学习的是一个从高维观测向量到高维姿态向量的映射,目前这在机器学习领域中还是一个非常困难的问题。 

        特征是描述模式的最佳方式,且我们通常认为特征的各个维度能够从不同的角度描述模式,在理想情况下,维度之间是互补完备的。 

        特征提取的主要目的是降维。特征抽取的主要思想是将原始样本投影到一个低维特征空间,得到最能反应样本本质或进行样本区分的低维样本特征。 

        一般图像特征可以分为四类:直观性特征、灰度统计特征、变换系数特征与代数特征。 

        直观性特征主要指几何特征,几何特征比较稳定,受人脸的姿态变化与光照条件等因素的影响小,但不易抽取,而且测量精度不高,与图像处理技术密切相关。 

        代数特征是基于统计学习方法抽取的特征。代数特征具有较高的识别精度,代数特征抽取方法又可以分为两类:一种是线性投影特征抽取方法;另外一种是非线性特征抽取方法。 

        习惯上,将基于主分量分析和Fisher线性鉴别分析所获得的特征抽取方法,统称为线性投影分析。 

       基于线性投影分析的特征抽取方法,其基本思想是根据一定的性能目标来寻找一线性变换,把原始信号数据压缩到一个低维子空间,使数据在子空间中的分布更加紧凑,为数据的更好描述提供手段,同时计算的复杂度得到大大降低。在线性投影分析中,以主分量分析(PCA,或称K-L变换)和Fisher线性鉴别分析(LDA)最具代表性,围绕这两种方法所形成的特征抽取算法,已成为模式识别领域中最为经典和广泛使用的方法。 

        线性投影分析法的主要缺点为:需要对大量的已有样本进行学习,且对定位、光照与物体非线性形变敏感,因而采集条件对识别性能影响较大。 

        非线性特征抽取方法也是研究的热点之一。“核技巧”最早应用在SVM中,KPCA和KFA是“核技巧”的推广应用。 

        核投影方法的基本思想是将原样本空间中的样本通过某种形式的非线性映射,变换到一个高维甚至无穷维的空间,并借助于核技巧在新的空间中应用线性的分析方法求解。由于新空间中的线性方向也对应原样本空间的非线性方向,所以基于核的投影分析得出的投影方向也对应原样本空间的非线性方向。 

        核投影方法也有一些弱点:几何意义不明确,无法知道样本在非显式映射后变成了什么分布模式;核函数中参数的选取没有相应选择标准,大多数只能采取经验参数选取;不适合训练样本很多的情况,原因是经过核映射后,样本的维数等于训练样本的个数,如果训练样本数目很大,核映射后的向量维数将会很高,并将遇到计算量上的难题。 

         就应用领域来说,KPCA远没有PCA应用的广泛。如果作为一般性的降维KPCA确实比PCA效果好,特别是特征空间不是一般的欧式空间的时候更为明显。PCA可以通过大量的自然图片学习一个子空间,但是KPCA做不到。 

        变换系数特征指先对图像进行Fourier变换、小波变换等,得到的系数后作为特征进行识别。
2017-12-15 12:33:16 Zachary_Co 阅读数 5876

原文站点:https://senitco.github.io/2017/06/15/image-feature-haar/

  Haar特征是一种用于目标检测或识别的图像特征描述子,Haar特征通常和AdaBoost分类器组合使用,而且由于Haar特征提取的实时性以及AdaBoost分类的准确率,使其成为人脸检测以及识别领域较为经典的算法。

多种Haar-like特征

  在Haar-like特征提出之前,传统的人脸检测算法一般是基于图像像素值进行的,计算量较大且实时性较差。Papageorgiou等人最早将Harr小波用于人脸特征表示,Viola和Jones则在此基础上,提出了多种形式的Haar特征。Lienhart等人对Haar矩形特征做了进一步的扩展,加入了旋转45的矩形特征,因此现有的Haar特征模板主要如下图所示:

haar.jpg

  在计算Haar特征值时,用白色区域像素值的和减去黑色区域像素值的和,也就是说白色区域的权值为正值,黑色区域的权值为负值,而且权值与矩形区域的面积成反比,抵消两种矩形区域面积不等造成的影响,保证Haar特征值在灰度分布均匀的区域特征值趋近于0。Haar特征在一定程度上反应了图像灰度的局部变化,在人脸检测中,脸部的一些特征可由矩形特征简单刻画,例如,眼睛比周围区域的颜色要深,鼻梁比两侧颜色要浅等。
  Haar-like矩形特征分为多类,特征模板可用于图像中的任一位置,而且大小也可任意变化,因此Haar特征的取值受到特征模板的类别、位置以及大小这三种因素的影响,使得在一固定大小的图像窗口内,可以提取出大量的Haar特征。例如,在一个24×24的检测窗口内,矩形特征的数量可以达到16万个。这样就需要解决两个重要问题,快速计算Haar矩形特征值——积分图;筛选有效的矩形特征用于分类识别——AdaBoost分类器。

快速计算——积分图

积分图构建

  在一个图像窗口中,可以提取出大量的Haar矩形特征区域,如果在计算Haar特征值时,每次都遍历矩形特征区域,将会造成大量重复计算,严重浪费时间。而积分图正是一种快速计算矩形特征的方法,其主要思想是将图像起始像素点到每一个像素点之间所形成的矩形区域的像素值的和,作为一个元素保存下来,也就是将原始图像转换为积分图(或者求和图),这样在求某一矩形区域的像素和时,只需索引矩形区域4个角点在积分图中的取值,进行普通的加减运算,即可求得Haar特征值,整个过程只需遍历一次图像,计算特征的时间复杂度为常数(O(1))。因此可以大大提升计算效率。
积分图中元素的公式定义如下:

ii(x,y)=Σxx,yyi(x,y)

上式含义是在(x,y)(第x行第y列)位置处,积分图中元素为原图像中对应像素左上角所有像素值之和。在具体实现时,可用下式进行迭代运算。
s(x,y)=s(x,y1)+i(x,y)

ii(x,y)=ii(x1,y)+s(x,y)

s(x,y)为行元素累加值,初始值s(x,1)=0,ii(1,y)=0

矩形特征计算

  构建好积分图后,图像中任何矩形区域的像素值累加和都可以通过简单的加减运算快速得到,如下图所示,矩形区域D的像素和值计算公式如下:

Sum(D)=ii(x4,y4)ii(x2,y2)ii(x3,y3)+ii(x1,y1)

rectangle.jpg
在下图中,以水平向右为x轴正方向,垂直向下为y轴正方向,可定义积分图公式Summed Area Table(SAT(x,y))

SAT(x,y)=Σ_xx,yyi(x,y)

以及迭代求解式
SAT(x,y)=SAT(x,y1)+SAT(x1,y)SAT(x1,y1)+I(x,y)

SAT(1,y)=0,SAT(x,1)=0

对于左上角坐标为(x,y),宽高为(w,h)的矩形区域r(x,y,w,h,0),可利用积分图SAT(x,y)求取像素和值
RecSum(r)=SAT(x+w1,y+h1)+SAT(x1,y1)SAT(x+w1,y1)SAT(x1,y+h1)

integer.jpg

旋转矩形特征的计算

  对于旋转矩形特征,相应的有45倾斜积分图用于快速计算Haar特征值,如下图所示,倾斜积分图的定义为像素点左上角45区域和左下角45区域的像素和,公式表示如下:

RSAT(x,y)=Σ_xx,xxyyi(x,y)

其递推公式计算如下:
RSAT(x,y)=RSAT(x1,y1)+RSAT(x1,y)RSAT(x2,y1)+I(x,y)

RSAT(x,y)=RSAT(x,y)+RSAT(x1,y+1)RSAT(x2,y)

其中RSAT(1,y)=RSAT(2,y)=RSAT(x,1)=0
也可直接通过下式递归计算:
RSAT(x,y)=RSAT(x1,y1)+RSAT(x+1,y1)RSAT(x,y2)+I(x1,y)+I(x,y)

以上3个积分图计算公式是等价的。
titled interger.jpg
如下图所示,构建好倾斜积分图后,可快速计算倾斜矩形区域r=(x,y,w,h,45)的像素和值
RecSum(r)=RSAT(x+w,y+w)+RSAT(xh,y+h)RSAT(x,y)RSAT(x+wh,y+w+h)

rotated rectangle.jpg

AdaBoost分类器

  由输入图像得到积分图,通过取不同种类、大小的Haar特征模板,并在不同位置处,利用积分图提取Haar矩形特征,可快速得到大量Haar特征值,AdaBoost分类器可用于对提取的Haar特征(通常需要做归一化处理)进行训练分类,并应用于人脸检测中。AdaBoost是一种集成分类器,由若干个强分类级联而成,而每个强分类器又由若干个弱分类器(例如决策树)组合训练得到。
弱分类器的定义如下:

hj(x)={1,pjfj(x)<pjθj 0,otherwise

上式中pj是为了控制不等式的方向而设置的参数。x表示一个图像窗口,fj(x)表示提取的Haar特征,阈值θ用于判断该窗口是否为目标区域(人脸)。
算法流程:
- 假设训练样本为(xi,yi),i=0,1,...,nyi取值为0(负样本)、1(正样本)。
- 初始化权重w1,i=12m,yi=12l,其中m表示负样本的个数,l表示正样本的个数。
- For t=1,2,...,T
1.归一化权值:wt,i=wt,iΣnj=1wt,j
2.对于每个(种)特征,训练一个分类器(hj),每个分类器只使用一种Haar特征进行训练。分类误差为εj=Σiwihj(xi)yihj为特征分类器,xi为训练图像样本。
3.选择最低误差的分类器ht
4.更新训练样本的权值wt+1,i=wt,iβ1eit,分类正确ei=0,分类错误ei=1βt=εt1εt
- 最后的强分类器为
h(x)=1,ΣTt=1αtht12ΣTt=1αt 0,otherwise

其中αt=log(1βt)

  在训练多个弱分类器得到强分类器的过程中,采用了两次加权的处理方法,一是对样本进行加权,在迭代过程中,提高错分样本的权重;二是对筛选出的弱分类器ht进行加权,弱分类器准确率越高,权重越大。此外,还需进一步对强分类器进行级联,以提高检测正确率并降低误识率。级联分类器如下所示:

cascade.jpg

  首先将所有待检测的子窗口输入到第一个分类器中,如果某个子窗口判决通过,则进入下一个分类器继续检测识别,否则该子窗口直接退出检测流程,也就是说后续分类器不需要处理该子窗口。通过这样一种级联的方式可以去除一些误识为目标的子窗口,降低误识率。例如,单个强分类器,99%的目标窗口可以通过,同时50%的非目标窗口也能通过,假设有20个强分类器级联,那么最终的正确检测率为0.9920=98%,而错误识别率为0.50200.0001%,在不影响检测准确率的同时,大大降低了误识率。当然前提是单个强分类器的准确率非常高,这样级联多个分类器才能不影响最终的准确率或者影响很小。

  在一幅图像中,为了能够检测到不同位置的目标区域,需要以一定步长遍历整幅图像;而对于不同大小的目标,则需要改变检测窗口的尺寸,或者固定窗口而缩放图像。这样,最后检测到的子窗口必然存在相互重叠的情况,因此需要进一步对这些重叠的子窗口进行合并,也就是非极大值抑制(NMS,non-maximum suppression),同时剔除零散分布的错误检测窗口。

reference

2019-07-19 08:12:50 weixin_41059269 阅读数 1461

采用Python、numpy库实现图像HOG特征的提取,主要用于分析HOG特征的具体算法流程。
参考链接:https://blog.csdn.net/qq_37141382/article/details/89342081
参考资料:
HOG的经典论文:Dalal N, Triggs B. Histograms of oriented gradients for human detection[C]//Computer Vision and Pattern Recognition, 2005. CVPR 2005. IEEE Computer Society Conference on. IEEE, 2005, 1: 886-893.(2016:Google Citation: 14046)

HOG特征提取算法的整个实现过程大致如下:
1、读入所需要的图像;
2、将RGB图像转为灰度图像(将输入的彩色的图像的r,g,b值通过特定公式转换为灰度值);
3、采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);
4、计算图像每个像素的梯度(包括大小和方向),捕获轮廓信息;
5、统计每个cell(以88为例)的梯度直方图(不同梯度方向的幅值),形成每个cell的feature descriptor;
6、将4个cell组成一个block(以2
2为例),一个block内4个cell的特征串联起来得到该block的HOG特征descriptor;
7、将图像内所有block的HOG特征descriptor串联起来得到该图像的HOG特征descriptor,这就是最终分类的特征向量。

Python代码,根据自己的需要改变cell的大小,block的大小:

#coding:utf-8
#*********************************************************************************************************
'''
说明:利用python/numpy/opencv实现图像HOG特征的提取
算法思路:
算法思路:
        1)以灰度图的方式加载图片,resize到(128,64);
        2)灰度图像gamma校正;
		3)利用一阶微分算子Sobel函数,分别计算出灰度图像X方向和Y方向上的一阶微分/梯度图像,根据得到的两幅
        梯度图像(X方向上的梯度图像和Y方向上的梯度图像),计算出这两幅梯度图像所对应的梯度幅值图像gradient_magnitude、
        梯度方向图像gradient_angle
		4)构造(cell_x = 128/8 =16, cell_y= 64/8 =8)大小的cell图像----梯度幅值的grad_cell图像,梯度方向的ang_cell图像,
        每个cell包含有8*8 = 64个值;
		5)将每个cell根据角度值(0-180)分为9个bin,并计算每个cell中的梯度方向直方图,每个cell有9个值;
		6)每(2*2)个cell为一个block,总共15*7个block,计算每个block的梯度方向直方图,并进行归一化处理,每个block中有9*4=36个值;
		7)计算整幅图像的梯度方向直方图HOG:将计算出来的所有的Block的HOG梯度方向直方图的特征向量首尾相接组成一个维度很大的向量
        长度为:15*7*36 = 3780,
        这个特征向量就是整幅图像的梯度方向直方图特征,这个特征可用于SVM分类。
'''
import cv2
import numpy as np
import matplotlib.pyplot as plt

#灰度图像gamma校正
def gamma(img):
    #不同参数下的gamma校正
    # img1 = img.copy()
    # img2 = img.copy()
    # img1 = np.power( img1 / 255.0, 0.5 )
    # img2 = np.power( img2 / 255.0, 2.2 )
    return np.power( img / 255.0, 1 )    

#获取梯度值cell图像,梯度方向cell图像
def div( img, cell_x, cell_y, cell_w ):
    cell = np.zeros( shape = ( cell_x, cell_y, cell_w, cell_w ) )
    img_x = np.split( img, cell_x, axis = 0 )
    for i in range( cell_x ):
        img_y = np.split( img_x[i], cell_y, axis = 1 )
        for j in range( cell_y ):
            cell[i][j] = img_y [j]
    return cell

#获取梯度方向直方图图像,每个像素点有9个值
def get_bins( grad_cell, ang_cell ):
    bins = np.zeros( shape = ( grad_cell.shape[0], grad_cell.shape[1], 9 ) )
    for i in range( grad_cell.shape[0] ):
        for j in range( grad_cell.shape[1] ):
            binn = np.zeros(9)
            grad_list = np.int8( grad_cell[i,j].flatten() )#每个cell中的64个梯度值展平,并转为整数
            ang_list = ang_cell[i,j].flatten()#每个cell中的64个梯度方向展平)
            ang_list = np.int8( ang_list / 20.0 )#0-9
            ang_list[ ang_list >=9 ] = 0
            for m in range(len(ang_list)):
                binn[ang_list[m]] += int( grad_list[m] )#不同角度对应的梯度值相加,为直方图的幅值
          #每个cell的梯度方向直方图可视化
            # N = 9
            # x = np.arange( N )
            # str1 = ( '0-20', '20-40', '40-60', '60-80', '80-100', '100-120', '120-140', '140-160', '160-180' )
            # plt.bar( x, height = binn, width = 0.8, label = 'cell histogram', tick_label = str1 )
            # for a, b in zip(x, binn):
                # plt.text( a, b+0.05, '{}'.format(b), ha = 'center', va = 'bottom', fontsize = 10 )
            # plt.show()
            bins[i][j] = binn
    return bins

#计算图像HOG特征向量,长度为 15*7*36 = 3780   
def hog( img, cell_x, cell_y, cell_w ):
    height, width = img.shape
    gradient_values_x = cv2.Sobel( img, cv2.CV_64F, 1, 0, ksize = 5 )#x方向梯度
    gradient_values_y = cv2.Sobel( img, cv2.CV_64F, 0, 1, ksize = 5 )#y方向梯度
    gradient_magnitude = np.sqrt( np.power( gradient_values_x, 2 ) + np.power( gradient_values_y, 2 ) )
    gradient_angle = np.arctan2( gradient_values_x, gradient_values_y )
    print( gradient_magnitude.shape, gradient_angle.shape )
    # plt.figure()
    # plt.subplot( 1, 2, 1 )
    # plt.imshow(gradient_angle)
    #角度转换至(0-180)
    gradient_angle[ gradient_angle > 0 ] *= 180 / 3.14
    gradient_angle[ gradient_angle < 0 ] = ( gradient_angle[ gradient_angle < 0 ] + 3.14 ) *180 / 3.14
    # plt.subplot( 1, 2, 2 )
    # plt.imshow( gradient_angle )
    # plt.show()

    grad_cell = div( gradient_magnitude, cell_x, cell_y, cell_w )
    ang_cell = div( gradient_angle, cell_x, cell_y, cell_w )
    bins = get_bins ( grad_cell, ang_cell )
    feature = []
    for i in range( cell_x - 1 ):
        for j in range( cell_y - 1 ):
            tmp = []
            tmp.append( bins[i,j] )
            tmp.append( bins[i+1,j] )
            tmp.append( bins[i,j+1] )
            tmp.append( bins[i+1,j+1] )
            tmp -= np.mean( tmp )
            feature.append( tmp.flatten() )
    return np.array( feature ).flatten()
                
if __name__ == '__main__':
    img = cv2.imread( './data/basketball1.png', cv2.IMREAD_GRAYSCALE )
    if( img is None ):
        print( 'Not read image.' )
    print( img.shape )
    resizeimg = cv2.resize( img, ( 128, 64 ), interpolation = cv2.INTER_CUBIC )
    cell_w = 8
    cell_x = int( resizeimg.shape[0] / cell_w )#cell行数
    cell_y = int( resizeimg.shape[1] / cell_w )#cell列数
    print( 'The size of cellmap is {}*{} '.format( cell_x, cell_y ) )
    gammaimg = gamma( resizeimg )*255    
    feature = hog( gammaimg, cell_x, cell_y, cell_w )
    print( feature.shape )

关于图像特征提取

阅读数 6787

图像特征提取

阅读数 6558

没有更多推荐了,返回首页