前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Haar-like特征提取原理

Haar-like特征提取原理

作者头像
chaibubble
发布2019-05-26 11:41:03
2.6K0
发布2019-05-26 11:41:03
举报
文章被收录于专栏:深度学习与计算机视觉

版权声明:本文为博主原创文章,转载请注明出处。 https://cloud.tencent.com/developer/article/1435201

Haar-like是一种非常经典的特征提取算法,尤其是它与AdaBoost组合使用时对人脸检测有着不错的效果,虽然只是在当时而言。OpenCV也对AdaBoost与Haar-like组成的级联人脸检测做了封装,所以一般提及Haar-like的时候,一般都会和AdaBoost,级联分类器,人脸检测,积分图等等一同出现。但是Haar-like本质上只是一种特征提取算法,下面我们只从特征提取的角度聊一聊Haar-like。它一共涉及到3篇经典的论文。


基本haar特征

最原始的Haar-like特征在2002年的《A general framework for object detection》提出,它定义了四个基本特征结构,如下A,B,C,D所示,可以将它们理解成为一个窗口,这个窗口将在图像中做步长为1的滑动,最终遍历整个图像。

比较特殊的一点是,当一次遍历结束后,窗口将在宽度或长度上成比例的放大,再重复之前遍历的步骤,直到放大到最后一个比例后结束。

那么可以放大的比例系数如何确定呢?设在宽度上可以放大的最大倍数为KwKwK_{w},高度上可以放大的最大倍数为KhKhK_{h},计算公式如下:

Kw=wIwwinKw=wIwwin

K_{w}=\frac{w_{I}}{w_{win}}

Kh=hIhwinKh=hIhwin

K_{h}=\frac{h_{I}}{h_{win}}

其中wIwIw_{I}和hIhIh_{I}是整个图像的宽高,wwinwwinw_{win}和hwinhwinh_{win}是haar窗口的初始宽高,可以放大的倍数为Kw⋅KhKw⋅KhK_{w}\cdot K_{h}。

Haar-like特征提取过程就是利用上面定义的窗口在图像中滑动,滑动到一个位置的时候,将窗口覆盖住的区域中的白色位置对应的像素值的和减去黑色位置对应的像素值的和,得到的一个数值就是haar特征中一个维度。

其中对于窗口C,黑色区域的像素值加和要乘以2,2是为了像素点个数相同而增加的权重。


扩展haar特征

在基本的四个haar特征基础上,文章《An extended set of Haar-like features for rapid object detection》对其做了扩展,将原来的4个扩展为14个。这些扩展特征主要增加了旋转性,能够提取到更丰富的边缘信息。


积分图计算

Haar的第三个经常提及的概念,就是积分图了,首先积分图这个东西和Haar一点关系都没有,它们是两个独立的概念。

之所以积分图与Haar联系到一起是因为一篇文章《Rapid object detection using a boosted cascade of simple features》,它使用积分图的方法快速计算Haar特征。下面我们先看一下什么时候积分图:

积分图是(Integral Image)类似动态规划的方法,主要的思想是将图像从起点开始到各个点所形成的矩形区域像素之存在数组中,当要计算某个区域的像素和时可以直接从数组中索引,不需要重新计算这个区域的像素和,从而加快了计算。

上面这幅图中有四个区域,A,B,C,D。我们将左上角的点记为0,区域AAA的所有点像素值的和记为sumAsumAsum_{A},点0与点1之间的积分图记为integral0,1integral0,1integral_{0,1}那么根据积分图的定义:

sumA=integral0,1sumA=integral0,1

sum_{A}=integral_{0,1}

sumA+B+C+D=integral0,4sumA+B+C+D=integral0,4

sum_{A+B+C+D}=integral_{0,4}

区域D的像素值和sumDsumDsum_{D}就应该为integral1,4integral1,4integral_{1,4},但是注意,自积分图中是没有从点1到点4的概念的,它所有的起点都应该是点0,所以:

sumD=integral1,4=integral0,4−integral0,2−integral0,3+integral0,1sumD=integral1,4=integral0,4−integral0,2−integral0,3+integral0,1

sum_{D}=integral_{1,4}=integral_{0,4}-integral_{0,2}-integral_{0,3}+integral_{0,1}

转化一下就是

sumD=sumA+B+C+D−sumA+B−sumA+C+sumAsumD=sumA+B+C+D−sumA+B−sumA+C+sumA

sum_{D}=sum_{A+B+C+D}-sum_{A+B}-sum_{A+C}+sum_{A}

上面的内容就是积分图,比如说我们要求sumDsumDsum_{D},并不需要从点1到点4做行列的遍历,因为这个遍历过程的时间复杂度是O(mn)的。我们只需要先存在下来从0到点1,2,3,4的积分图,然后做一个简单的加减法就好了,这个时间复杂度仅仅为O(1)。当然了,存储的过程是消耗空间复杂度的,这是很典型的空间换时间的套路。这就是上面提到的积分图加速计算的过程,那么它和Haar有啥关系呢?

我们注意到,积分图是在计算一个区域内所有点的像素值的和,Harr的特征提取过程也是这样啊,它们本质上在做一个东西而已,积分图那套东西,搬到Haar特征计算上完全不需要一点改的啊。

比如上面这样图所示的Haar窗口,滑动到了当前位置,我们要计算此时的Haar特征,它是区域A+C的像素值的和减去区域B的:

Harrv1=sumA+C−sumBHarrv1=sumA+C−sumB

Harr_{v1}=sum_{A+C}-sum_{B}

sumA+C=sumA+sumC=integral0,1+integral0,3−integral0,2sumA+C=sumA+sumC=integral0,1+integral0,3−integral0,2

sum_{A+C}=sum_{A}+sum_{C}=integral_{0,1}+integral_{0,3}-integral_{0,2}

sumB=integral0,2−integral0,1sumB=integral0,2−integral0,1

sum_{B}=integral_{0,2}-integral_{0,1}

于是,就计算出了当前的Haar特征。


维度计算

我们知道了Harr特征的计算过程,它的维度就很好计算出来了。

Haar的总维度应该是每一种窗口产生的维度的和;

而每一种窗口产生的维度又是它遍历所有比例之后的维度和;

一个窗口固定一个比例时的维度就是滑动遍历整个图像所产生的维度和。

【图像处理】计算Haar特征个数这篇博客中给出了详细的计算过程,在这里就不做重复了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年04月15日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本haar特征
  • 扩展haar特征
  • 积分图计算
  • 维度计算
相关产品与服务
人脸识别
腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档