opencv直方图
图像的直方图
- 直方图是图像中像素强度分布的图形表达方式,它统计了每一个强度值所具有的像素个数。
- 横坐标代表了图像像素的种类,可以是灰度,也可以是彩色。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比。
- 像素是组成图像的最基本单元要素:点。分辨率是指在长和宽的两个方向上各拥有的像素个数。
- 像素分布的直方图往往可以作为图像一个很重要的特征,在实际工程中,图像直方图在特征提取、图像匹配等方面都有很好的应用。
直方图均衡化
- 直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法。
- 均衡化指的是把一个分布 (给定的直方图) 映射 到另一个分布 (一个更宽更统一的强度值分布), 所以强度值分布会在整个范围内展开。
函数调用
cvtColor( src, src, CV_BGR2GRAY );
equalizeHist( src, dst );
直方图计算
- 直方图是对数据的集合统计,并将统计结果分布于一系列预定义的 bins 中。
- 这里的数据不仅仅指的是灰度值, 统计数据可能是任何能有效描述图像的特征。
- bins 表示统计的数据范围分割成的子区域:range = bins1 U bins2 U bins3 …
函数调用
//计算直方图:
calcHist( &rgb_planes[0], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate );
参数说明如下:
- &rgb_planes[0]: 输入数组(或数组集)
- 1: 输入数组的个数
- 0: 需要统计的通道 (dim)索引
- Mat(): 掩码( 0 表示忽略该像素), 如果未定义,则不使用掩码
- r_hist: 储存直方图的矩阵
- 1: 直方图维数
- histSize: 每个维度的bin数目
- histRange: 每个维度的取值范围
- uniform 和 accumulate: bin大小相同,清除直方图痕迹
//将直方图归一化到范围 [ 0, histImage.rows ]
normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
参数说明如下:
- r_hist: 输入数组
- r_hist: 归一化后的输出数组(支持原地计算)
- 0 及 histImage.rows: 这里,它们是归一化 r_hist 之后的取值极限
- NORM_MINMAX: 归一化方法 (例中指定的方法将数值缩放到以上指定范围)
- -1: 指示归一化后的输出数组与输入数组同类型
- Mat(): 可选的掩码
原理
- 要比较两个直方图( H_{1} and H_{2} ), 首先必须要选择一个衡量直方图相似度的对比标准 (d(H_{1}, H_{2}))。
- OpenCV 函数 compareHist 执行了具体的直方图对比的任务。
原理
- 反向投影是一种记录给定图像中的像素点如何适应直方图模型像素分布的方式。
反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的该特征。
反向投影用于在输入图像(通常较大)中查找特定图像(通常较小或者仅1个像素,以下将其称为模板图像)最匹配的点或者区域,也就是定位模板图像出现在输入图像的位置。
反向投影查找原理:查找的方式就是不断的在输入图像中切割跟模板图像大小一致的图像块,并用直方图对比的方式与模板图像进行比较。
假设我们有一张100x100的输入图像,有一张10x10的模板图像,查找的过程:
- 从输入图像的左上角(0,0)开始,切割一块(0,0)至(10,10)的临时图像;
- 生成临时图像的直方图;
- 用临时图像的直方图和模板图像的直方图对比,对比结果记为c;
- 直方图对比结果c,就是结果图像(0,0)处的像素值;
- 切割输入图像从(0,1)至(10,11)的临时图像,对比直方图,并记录到结果图像;
- 重复以上步骤直到输入图像的右下角。
反向投影的结果包含了:以每个输入图像像素点为起点的直方图对比结果。可以把它看成是一个二维的浮点型数组,二维矩阵,或者单通道的浮点型图像。可以这样理解:对于calcBackProjectPatch,也就是是基于块的反向投影形式,利用直方图做匹配,类似于模板匹配,只不过这些模板转换为直方图,而原图中以某点为基准,抠出来作对比的部分也转换为直方图,两个直方图作匹配,匹配的结果作为此点的值。结果会是一张灰度图。
如果输入图像和模板图像一样大,那么反向投影相当于直方图对比。如果输入图像比模板图像还小,无法进行反向投影。
步骤
- 对测试图像中的每个像素 ( p(i,j) ),获取色调数据并找到该色调( ( h_{i,j}, s_{i,j} ) )在直方图中的bin的位置。
- 查询 模型直方图 中对应的bin - ( h_{i,j}, s_{i,j} ) - 并读取该bin的数值。
- 将此数值储存在新的图像中(BackProjection)。 你也可以先归一化 模型直方图 ,这样测试图像的输出就可以在屏幕显示了。
- 使用统计学的语言, BackProjection 中储存的数值代表了测试图像中该像素属于特征区域的概率。