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

相关文章

HTML5 中的<button>标签用法和特征

《HTML5中的<button>标签用法和特征》在HTML5中,button标签用于定义一个可点击的按钮,它是创建交互式网页的重要元素之一,本文将深入解析HTML5中的button标签,详细介绍其属... 目录引言<button> 标签的基本用法<button> 标签的属性typevaluedisabled

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

宝塔安装的MySQL无法连接的情况及解决方案

《宝塔安装的MySQL无法连接的情况及解决方案》宝塔面板是一款流行的服务器管理工具,其中集成的MySQL数据库有时会出现连接问题,本文详细介绍两种最常见的MySQL连接错误:“1130-Hostisn... 目录一、错误 1130:Host ‘xxx.xxx.xxx.xxx’ is not allowed

Python+wxPython构建图像编辑器

《Python+wxPython构建图像编辑器》图像编辑应用是学习GUI编程和图像处理的绝佳项目,本教程中,我们将使用wxPython,一个跨平台的PythonGUI工具包,构建一个简单的... 目录引言环境设置创建主窗口加载和显示图像实现绘制工具矩形绘制箭头绘制文字绘制临时绘制处理缩放和旋转缩放旋转保存编

python+OpenCV反投影图像的实现示例详解

《python+OpenCV反投影图像的实现示例详解》:本文主要介绍python+OpenCV反投影图像的实现示例详解,本文通过实例代码图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前言二、什么是反投影图像三、反投影图像的概念四、反向投影的工作原理一、利用反向投影backproj

使用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 元素处