Haar特征

Haar特征是一种反映图像的灰度变化的,像素分模块求差值的一种特征。它分为三类:边缘特征、线性特征、中心特征和对角线特征。用黑白两种矩形框组合成特征模板,在特征模板内用 黑色矩形像素和 减去 白色矩形像素和来表示这个模版的特征值。例如:脸部的一些特征能由矩形模块差值特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述在特定方向(水平、垂直、对角)上有明显像素模块梯度变化的图像结构。

这里写图片描述

如上图A、B、D模块的图像Haar特征为:v=Sum白-Sum黑
C 模块的图像Haar特征为:v=Sum白(左)+Sum白(右)-2*Sum黑
这里要保证白色矩形模块中的像素与黑色矩形的模块的像素数相同,所以乘2

对于一幅图像来说,可以通过通过改变特征模板的大小和位置,可穷举出大量的特征来表示一幅图像。上图的特征模板称为“特征原型”;特征原型在图像子窗口中扩展(平移伸缩)得到的特征称为“矩形特征”;矩形特征的值称为“特征值”。例如在24*24大小的图像中可以以坐标(0,0)开始宽为20高为20矩形模版计算上图A特征,也可以以坐标(0,2)开始宽为20高为20矩形模版计算上图A特征,也可以以坐标(0,0)开始宽为22高为22矩形模版计算上图A特征,这样矩形特征值随着类别、大小和位置的变化,使得很小的一幅很小的图像含有非常多的矩形特征。矩形特征值是矩形模版类别、矩形位置和矩形大小这三个因素的函数。

Haar特征计算方法

首先介绍下积分图:如下述代码所示,是opencv中存储图像积分图的结构体,可以看到有两种积分图sum积分图,titled sum积分图。sum积分图用来计算一般的垂直或水平的矩形特征,如下面的(a)、(b)、(c)、(d)。。。,而titled sum积分图用来计算倾斜45度的积分图,如下面的(1c)、(1d)、(2c)。。。

/* Prepared for training samples */
typedef struct CvHaarTrainingData
{
    CvSize winsize;     /* training image size */
    int    maxnum;      /* maximum number of samples */
    CvMat  sum;         /* sum images (each row represents image) */
    CvMat  tilted;      /* tilted sum images (each row represents image) */
    CvMat  normfactor;  /* normalization factor */
    CvMat  cls;         /* classes. 1.0 - object, 0.0 - background */
    CvMat  weights;     /* weights */

    CvMat* valcache;    /* precalculated feature values (CV_32FC1) */
    CvMat* idxcache;    /* presorted indices (CV_IDX_MAT_TYPE) */
} CvHaarTrainigData;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

sum积分图主要的思想是将图像从起点开始到各个点所形成的矩形区域像素之和作为一个数组的元素保存在内存中,当要计算某个区域的像素和时可以直接索引数组的元素,不用重新计算这个区域的像素和。例如:对一个X*Y图像它的积分图也是一个X*Y的元素为int型的积分图,对应积分图中(x,y)位置值表示就是原图像矩形框[(0,0), (x,y)]内所有像素的和。如下图所示:

这里写图片描述

用公式表示:
其中p(i,j)表示原图在(i,j)位置像素值,f(x,y)表示积分图在(x,y)位置值

积分图能够在多种尺度下,使用相同的时间(常数时间)来计算不同的特征,因此大大提高了检测速度。如下图所示图片不位置不同大小矩形框的两个A特征,他们的计算方式分别为:
[f(x,y)+f(i,j)-f(s,t)-f(l,m)]-[f(s,t)+f(h,k)-f(i,j)-f(n,o)]
[f(X,Y])+f(I,J)-f(S,T)-f(L,M)]-[f(S,T)+f(H,K)-f(I,J)-f(N,O)]
可见两个不同大小的特征计算量却一样!!!

这里写图片描述

titled sum类积分图计算的是45°旋角的矩形特征。为了便于计算45°旋角的矩形特征,我们定义titled sum类积分图中(x,y)点值为RSAT(x,y),它表示原始图像中(x,y)左上角45°区域和左下角45°区域的像素和。
这里写图片描述
用公式表示如下:

对于每一点的积分图计算方法有如下递推公式 ,来节约性能,减少生重复计算:

而计算矩阵特征的特征值,是位于十字行矩形RSAT(x,y)之差。如下图的矩形特征为:
[RSAT(m,n)-RSAT(i,j)-RSAT(k,l)+RSAT(s,t)]-[RSAT(o,p)-RSAT(m,n)-RSAT(x,y)+RSAT(k,l)]
这里写图片描述

同理,该积分图也能够在多种尺度下,使用相同的时间(常数时间)来计算不同的45度矩形特征。

Haar特征对应的opencv源码

Viola提出的haar特征:
这里写图片描述

Lienhart等牛们提出的Haar-like特征:
这里写图片描述

opencv源码中负责创建几种haar特征的是函数icvCreateIntHaarFeatures, 在进入分类器训练函数后执行该函数,它根据大小为winsize的图,计算所有HaarFeature的rect的顶点坐标来确定特征并将它存入CvIntHaarFeatures结构体数组中。后续针对不同的图像只需用这些矩形框的顶点来获得积分图在该点的值就可以计算也图像该特征的具体值了。symmetric为0时表示创建所有特征,为1时表示目标图形是垂直对称的所以只需创建所有中心在左半边部位的特征。mode==0表示Viola提出的原始矩形特征,mode==1表示所有垂直的haar特征,mode==2表示所有特征

具体每种特征的名称如下图::
这里写图片描述

### Haar特征的定义与原理 Haar特征是一种在计算机视觉领域广泛使用的特征描述方法,尤其适合于目标检测任务,例如人脸检测[^1]。其核心思想是通过简单的矩形滤波器来捕捉图像中的边缘、线条以及纹理信息。 #### 定义 Haar特征基于一组预定义的模板模式,这些模板可以表示为两个或三个相邻区域之间的像素强度差异。常见的Haar特征包括水平边缘、垂直边缘、对角线方向的条纹以及中心突出的方框结构等。每种特征都由白色和黑色矩形组成,其中白区代表正权重,黑区代表负权重[^2]。 #### 原理 计算Haar特征的过程涉及将上述模板应用于输入图像的不同位置,并统计该区域内所有像素值加权后的总和。具体来说,在某个特定窗口上应用某一类型的Haar特征时,会先乘以相应的位置系数再求和得到最终的结果。这种方法能够有效地反映局部对比度变化情况从而区分不同类别对象之间存在的显著区别之处。 为了提高效率并减少冗余运算量,“积分图”技术被引入进来作为辅助工具之一。“积分图”的概念是指对于任意给定坐标(x,y),它存储的是从原点到此坐标的子矩阵内所有元素累加之和。利用这一特性可以使原本复杂耗时的操作简化成常数时间完成即O(1)。 ### 应用场景 Haar特征最初是由Paul Viola 和 Michael Jones 提出用于快速面部探测系统当中的一部分构成要素;后来也被扩展至其他多种场合下的实例分割或者跟踪等问题解决过程中发挥重要作用: - **人脸识别**:这是最经典的案例之一,通过训练大量正面脸部样本建立起专用模型之后即可实现实时高效的人脸定位功能。 - **行人检测**:类似于前者但更加注重全身轮廓形状方面的考量因素加入进去形成新的评判标准以便更好地适应实际需求环境变化带来的挑战[^3]。 - **通用物体识别**:除了专门针对某些固定种类之外还可以泛化运用到更多未知类型上面去尝试探索潜在可能性空间范围内的最佳匹配方案选项集合列表里面寻找最优解路径轨迹路线规划地图绘制等等一系列相关联操作流程环节步骤顺序安排合理布局设计构思创意创新思维能力培养锻炼提升等方面均有所体现表现出来效果明显优于传统方法论体系框架结构层次分明清晰易懂便于理解和掌握学习记忆背诵复习巩固加强加深印象持久保持长久不忘遗忘丢失遗漏错误偏差失误风险降低最小程度范围内达到预期目的目标达成一致共识意见统一行动协调配合默契团队合作精神风貌展现风采魅力无限延伸拓展发展空间广阔前景光明未来可期期待憧憬向往追求理想境界高度升华超越自我突破极限创造奇迹辉煌成就伟大事业功成名就名垂青史流芳百世万古长存永恒不朽! ```python import cv2 import numpy as np def compute_haar_feature(image, feature_type='edge'): """ 计算指定类型的Haar特征 参数: image (numpy.ndarray): 输入灰度图像 feature_type (str): 特征类型 ('edge', 'line', ...) 返回: float: 当前窗口下对应Haar特征值 """ if feature_type == 'edge': # 水平边缘特征示例 sum_white = np.sum(image[:int(len(image)/2), :]) sum_black = np.sum(image[int(len(image)/2):, :]) return abs(sum_white - sum_black) # 示例调用 gray_image = cv2.imread('face.jpg', 0) feature_value = compute_haar_feature(gray_image) print(f'Computed Haar Feature Value: {feature_value}') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值