Haar特征(一种矩形特征,反映了图像的灰度变化情况)

2023-10-28 19:40

本文主要是介绍Haar特征(一种矩形特征,反映了图像的灰度变化情况),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Haar特征最先由Paul Viola等人提出,后经过Rainer Lienhart等扩展引入45°倾斜特征。Haar特征分为三类:边缘特征、线性特征、中心特征和对角线特征,组合成特征模板。

OpenCV(2.4.11版本)所使用的共计14种Haar特征,包括5种Basic特征、3种Core特征和6种Titled(即45°旋转)特征。在使用opencv自带的训练工具进行训练时,haarFeatureParams参数中的mode参数正对应了训练过程中所使用的特征集合:
1. 如果mode为BASIC,则只使用BASIC的5种Haar特征进行训练,训练出的分类器也只包含这5种特征。
2. 如果mode为CORE,则使用BASIC的5种+CORE的3种Haar特征进行训练。
3. 如果mode为ALL,则使用BASICA的5种+CORE的3种+ALL的6种Titled共14种特征进行训练。
默认使用BASIC模式,实际中训练和检测效果已经足够好。不建议使用ALL参数,引入Titled倾斜特征需要多计算一张倾斜积分图,会极大的降低训练和检测速度。

 

1、矩形特征模板的生成
haar特征模板内有白色和黑色两种矩形,模板的Haar特征值=白色矩形像素和减去黑色矩形像素和:
                               $$featureValue(x)=weight_{white} * \sum_{Pixel\in White} Pixel+weight_{black}*\sum_{Pixel\in Blcak}Pixel$$
设置权值就是为了抵消面积不等带来的影响,保证所有矩形Haar特征的特征值在灰度分布绝对均匀的图中为0: 

a、对于上图中的x3和y3,$Weight_{White}=1$,$Weight_{Black}=-2$;
b、对于上图中的Point特征,$Weight_{White}=1$,$Weight_{Black}=-8$;  
c、其余11种特征,$Weight_{White}=1$,$Weight_{Black}=-1$;    
Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单描述,如眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述特定走向(水平、垂直、对角)的结构。 


 2、Haar特征的子特征生成
Haar特征矩形特征可位于图像任意位置,大小也可以任意改变,所以矩形特征值是矩形模版类别、矩形位置和矩形大小这三个因素的函数。故类别、大小和位置的变化,使得很小的检测窗口含有非常多的矩形特征,如:在24*24像素大小的检测窗口内矩形特征数量可以达到16万个(特定类别的矩形模板尺寸放缩时其黑白区域比例不变)。  
以上图x3特征为例,在放大+平移过程中白:黑:白面积比始终是1:1:1。首先在红框所示的检测窗口中生成大小为3个像素的最小x3特征;之后分别沿着x和y平移产生了在检测窗口中不同位置的大量最小3像素x3特征;然后把最小x3特征分别沿着x和y放大(整数倍放大且保持黑白面积比例不变),再平移,又产生了一系列大一点x3特征;然后继续放大和平移,重复此过程,直到放大后的x3和检测窗口一样大。这样x3就产生了完整的x3系列特征。

那么这些通过放大+平移的获得的子特征到底总共有多少个:
假设检测窗口大小为W*H,矩形特征大小为w*h,X和Y为表示矩形特征在水平和垂直方向的能放大的最大比例系数:

则总共可以获得的子特征数目为:  

参数解释:
1、特征竖直方向方大1倍,即无放大,竖直方向有 $H-h+1$ 个特征;  
2、特征竖直方向放大2倍,竖直方向有$H-2h+1$ 个特征;  
3、特征竖直方向放大3倍,竖直方向有 $H-3h+1$个特征;  
4、特征竖直方向放大$Y=floor(H/h)$倍,竖直方向有 $H-Y*h+1$个特征;  
5、基于以上,竖直方向共有$(H-h+1)+(H-2h+1)+(H-3h+1)+...+(H-Y*h+1)=Y[H+1-h(1+Y)/2]$个特征,同理水平方向:   $X[W+1-w(1+X)/2]$个特征; 

6、由于水平方向和垂直方向相互独立,所以子特征数目为:子特征数目 = 水平方向数目x垂直方向数目;  

3、Haar特征值归一化(标准归一化也可以)

Haar特征计算出的特征值变化范围非常大,不利于量化评定特征值,所以需要进行“归一化”,压缩特征值范围。假设当前检测窗口中的图像像素为i(x,y),当前检测窗口为w*h大小,OpenCV采用如下方式归一化:
1、计算检测窗口中图像的灰度值和灰度值平方和:  
sum=\sum i(x,y)
sq_{sum}=\sum i^2(x,y)
2、计算平均值:
mean=\frac{sum}{w*h}
sq_{mean}=\frac{sq_{sum}}{w*h}
3、计算归一化因子:
varNormFactor=\sqrt{sq_{mean}-mean^2}
4、归一化特征值:  
normValue=\frac{featureValue}{varNormFactor}


4、Haar-like特征计算-积分图----滑窗默认步长为1

积分图就是只遍历一次图像就可以求出图像中所有区域像素和的快速算法,大大的提高了图像特征值计算的效率。对于一个灰度图像I而言,其积分图也是一张与I尺寸相同的图,只不过该图上任意一点(x,y)的值是指从灰度图像I的左上角与当前点所围成的举行区域内所有像素点灰度值之和,类似于图像直方图与图像累积直方图的关系,这里只不过是二维的图像。

当把图像扫描一遍,到达图像右下角像素时,积分图像就构造好了。积分图构造好之后,图像中任何矩阵区域的像素累加和都可以通过简单运算得到如上图所示。而Haar-like特征值无非就是两个或三个矩阵像素和的差,同样可以在常数时间内完成。所以矩形特征的特征值计算,只与此特征矩形的端点的积分图有关,所以不管此特征矩形的尺度变换如何,特征值的计算所消耗的时间都是常量。这样只要遍历图像一次,就可以求得所有子窗口的特征值。

5、45°旋转积分图
基于点90°夹角的射线与原图左上角包围的像素和构成旋转积分图:

设有如下图红色方框大小的灰度图image,其计算出来的45°旋转灰度图为titled(第1行和第1列为0),虚线代表image中cv::Rect为<3 1 2 3>区域。显然虚线区域的灰度和为:titled(2,6) - titled(1,4) - titled(6,3) + titled(1,4):

在实际中,如果使用旋转特征,则需要多计算一张积分图。但是旋转特征的效果往往不理想,得不偿失,不建议使用。故仅做了解就可以了。

这篇关于Haar特征(一种矩形特征,反映了图像的灰度变化情况)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/295492

相关文章

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

Nginx实现前端灰度发布

《Nginx实现前端灰度发布》灰度发布是一种重要的策略,它允许我们在不影响所有用户的情况下,逐步推出新功能或更新,通过灰度发布,我们可以测试新版本的稳定性和性能,下面就来介绍一下前端灰度发布的使用,感... 目录前言一、基于权重的流量分配二、基于 Cookie 的分流三、基于请求头的分流四、基于请求参数的分

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

MySQL进阶之路索引失效的11种情况详析

《MySQL进阶之路索引失效的11种情况详析》:本文主要介绍MySQL查询优化中的11种常见情况,包括索引的使用和优化策略,通过这些策略,开发者可以显著提升查询性能,需要的朋友可以参考下... 目录前言图示1. 使用不等式操作符(!=, <, >)2. 使用 OR 连接多个条件3. 对索引字段进行计算操作4

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O