Haar特征


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


1.Introduction

Rapid Object Detection using a Boosted Cascade of Simple Features

Haar特征是由Viola和Jones在2001年提出的,用于面部识别和人脸检测。

Haar特征的基本思想是将图像划分为多个矩形区域,并计算每个矩形区域内像素值的差异,从而得到一组能够有效描述图像特征的数值。Haar特征与小波变换有相似之处,因此也被称之为Haar小波。

Haar特征由一系列可以缩放的矩形(如下图所示)结合原图像进行运算得到的,这种方法最早在1909年由匈牙利数学家Alfred Haar提出。Haar Feature的求解过程与卷积有相似之处。

在这里插入图片描述

如上图中,一种矩形表示一种Haar特征,大小不同也能得到不同的Haar特征。其应用思路如下,考虑人脸检测,Haar特征能够识别出人脸的关键部位。如下图,检测眉毛位置使用图中所示意的Haar特征,因眉毛处的像素比额头处要暗,也就是灰度值小,拿矩形白色部分的像素和减去黑色矩形的像素和,能得到比其他部位更大的灰度插值。同样,对鼻子处,左右部分也存在灰度差值。

图片来自于1
在这里插入图片描述

2.Haar特征计算详解

在这里插入图片描述

以上图所示的模式来计算Haar特征。

在这里插入图片描述

上面这个图表示的是对一个3x3大小的图像求type-2-x模式的Haar特征的过程,即黑色区域像素和减去白色区域像素和。一个宽高3x3的图像,经过rescaletype-2-xHaar变换可以得到12个特征值。当图像尺度变大时能够得到更多的Haar特征。对一个宽高8x8的图像,type-2-xHaar变换可以得到576个特征值;而对一个宽高56x56的图像,type-2-xHaar变换可以得到1251264个特征值。

从上面的示例中也可以看到,Haar变换的计算过程涉及到图像区域像素的求和,不同scale的Haar变换,图像区域其实是有重和的,反复的进行求和比较耗时,为了提高计算的性能,可以使用积分图改进Haar算法。

积分图的定义是对于图像每个像素将其左上角所有像素求和所得如上面的宽高3x3图像的示例,其对应的积分图为:

在这里插入图片描述

有了积分图后,可以借助积分图求图像特定区域的面积。

在这里插入图片描述

看上面这张图,表示原始图像的积分图,想要求原图像区域D中的像素和,使用积分图计算如下:

积分图上点1处的值为:ii(1)=RectSum(A)

积分图上点2处的值为:ii(2)=RectSum(A) - RectSum(B)

积分图上点3处的值为:ii(3)=RectSum(A) + RectSum(C)

积分图上点4处的值为:ii(1)=RectSum(A) - RectSum(B) + RectSum(C) + RectSum(D)

求区域D的像素和可表示成RectSum(D)=ii(4) + ii(1) - ii(2) - ii(3),通过这种方式计算原图像中区域像素的和可以极大的减少运算量,加快运算速度。

通过上面的介绍可以知道,一张图像可以得到非常多的Haar特征,很多特征都是和目标检测无关的,传统的方法通常将Adaboost分类器和Haar特征一起使用,其思想是将Haar特征当成很多个弱分类器,再使用Adaboost将如此多的弱分类器组合到一起组成强分类器。实际使用中,采用级联的分类器,以便更快的判断出图像区域中是否包含人脸,如下图,

在这里插入图片描述

使用AdaboostHaar特征来做人脸检测的例子可以参考SkImage的示例。

3.使用sklearn计算Haar特征

skimage.feature.haar_like_feature(int_image, r, c, width, height, feature_type=None, feature_coord=None)
  • r: 计算Haar特征图像的起始区域左上角的行坐标
  • c: 计算Haar特征图像的起始区域左上角的列坐标
  • width: 计算Haar特征图像的区域宽度
  • height: 计算Haar特征图像的起始区域高度
  • feature_type:计算Haar特征使用的模式,支持type-2-x/type-2-y/type-3-x/type-3-y/type-4这几种。
  • feature_coord:计算Haar特征使用的模式矩形,白色和黑色区域的起始和终止坐标,其值可以使用haar_like_feature_coord()方法来获取。具体看下面的例子。

在这里插入图片描述

from skimage import feature
import numpy as np
from skimage.transform import integral_image
img = np.random.randint(0, 255, (56, 56))
img = np.uint8(img)
"""
img:
[[ 70  84  24]
 [ 41 222 212]
 [252 164 108]]
"""

types = np.array(['type-2-x', 'type-2-x'])
int_image = img
h, w = int_image.shape[:2]
ii = integral_image(int_image)
feat_coord = np.array([[[[0, 0], [0, 0]], [(0, 1), (0, 1)]],[[(0, 0), (1, 0)], [(0, 1), (1, 1)]]])
feat = feature.haar_like_feature(ii, 0, 0, w, h, feature_type=types, feature_coord=feat_coord)
"""
intergral_img:
[[  70  154  178]
 [ 111  417  653]
 [ 363  833 1177]]
Haar Feature: [ 14 195]

使用haar_like_feature_coord计算矩形的起始区域:

feat_coord, feat_type = feature.haar_like_feature_coord(3, 3, 'type-2-x')
print(feat_coord)

"""
Haar Coordinate:
[list([[(0, 0), (0, 0)], [(0, 1), (0, 1)]])
 list([[(0, 0), (1, 0)], [(0, 1), (1, 1)]])
 list([[(0, 0), (2, 0)], [(0, 1), (2, 1)]])
 list([[(0, 1), (0, 1)], [(0, 2), (0, 2)]])
 list([[(0, 1), (1, 1)], [(0, 2), (1, 2)]])
 list([[(0, 1), (2, 1)], [(0, 2), (2, 2)]])
 list([[(1, 0), (1, 0)], [(1, 1), (1, 1)]])
 list([[(1, 0), (2, 0)], [(1, 1), (2, 1)]])
 list([[(1, 1), (1, 1)], [(1, 2), (1, 2)]])
 list([[(1, 1), (2, 1)], [(1, 2), (2, 2)]])
 list([[(2, 0), (2, 0)], [(2, 1), (2, 1)]])
 list([[(2, 1), (2, 1)], [(2, 2), (2, 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、付费专栏及课程。

余额充值