OpenCV学习笔记(十) 直方图操作
直方图计算

直方图可以统计的不仅仅是颜色灰度, 它可以统计任何图像特征 (如 梯度, 方向等等)。直方图的一些具体细节:
- dims: 需要统计的特征的数目, 在上例中, dims = 1 因为我们仅仅统计了灰度值(灰度图像)。
- bins: 每个特征空间 子区段 的数目,在上例中, bins = 16
- range: 每个特征空间的取值范围,在上例中, range = [0,255]
怎样去统计两个特征呢? 在这种情况下, 直方图就是3维的了,x轴和y轴分别代表一个特征, z轴是掉入
组合中的样本数目。OpenCV提供了一个简单的计算数组集(通常是图像或分割后的通道)的直方图函数 calcHist 。 支持高达 32 维的直方图。
/// 分割成3个单通道图像 ( R, G 和 B )
vector<Mat> rgb_planes;
split( src, rgb_planes ); /// 设定bin数目
int histSize = 255; /// 设定取值范围 ( R,G,B) )
float range[] = { 0, 255 } ;
const float* histRange = { range }; bool uniform = true; bool accumulate = false; /// 计算直方图:
calcHist( &rgb_planes[0], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate );
- &rgb_planes[0]: 输入数组(或数组集)
- 1: 输入数组的个数 (这里我们使用了一个单通道图像,我们也可以输入数组集 )
- 0: 需要统计的通道 (dim)索引 ,这里我们只是统计了灰度 (且每个数组都是单通道)所以只要写 0 就行了。
- Mat(): 掩码( 0 表示忽略该像素), 如果未定义,则不使用掩码
- r_hist: 储存直方图的矩阵
- 1: 直方图维数
- histSize: 每个维度的bin数目
- histRange: 每个维度的取值范围
- uniform 和 accumulate: bin大小相同,清楚直方图痕迹
在画直方图之前,先使用 normalize 归一化直方图,这样直方图bin中的值就被缩放到指定范围(这个步骤只是为了让直方图的值可以显示在目标窗口中):
/// 将直方图归一化到范围 [ 0, histImage.rows ]
normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
画出直方图也有一些小技巧(窗口上方y轴坐标为0,向下增长):
/// 在直方图画布上画出直方图
for( int i = 1; i < histSize; i++ )
{
line( histImage, Point( bin_w*(i-1), hist_h - cvRound(r_hist.at<float>(i-1)) ) ,
Point( bin_w*(i), hist_h - cvRound(r_hist.at<float>(i)) ),
Scalar( 0, 0, 255), 2, 8, 0 );
}
以上。
直方图均衡化

直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法.
注意:只能对单通道进行均衡化。
equalizeHist( src, dst );
要想实现均衡化的效果, 映射函数应该是一个 累积分布函数 (cdf) (更多细节, 参考*学习OpenCV*). 对于直方图
, 它的 累积分布
是:

要使用其作为映射函数, 我们必须对最大值为255 (或者用图像的最大强度值) 的累积分布
进行归一化. 同上例, 累积分布函数为:

最后, 我们使用一个简单的映射过程来获得均衡化后像素的强度值:
详细映射过程
直方图对比(计算相似度)
OpenCV 函数 compareHist 执行了具体的直方图对比的任务。该函数提供了4种对比标准来计算相似度:
Correlation ( CV_COMP_CORREL )

其中

是直方图中bin的数目。Chi-Square ( CV_COMP_CHISQR )

Intersection ( CV_COMP_INTERSECT )

Bhattacharyya 距离( CV_COMP_BHATTACHARYYA )

double base_test1 = compareHist( hist_base, hist_test1, compare_method );
对于 Correlation 和 Intersection 标准, 值越大相似度越大。而另外两种对比标准,则是结果越小相似度越大。
反向投影
反向投影是一种记录给定图像中的像素点如何适应直方图模型像素分布的方式。所谓反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的该特征。其步骤为:
- 统计原图像的 模型直方图(Hue-Saturation)。
对测试图像中的每个像素 (
),获取色调数据并找到该色调(
)在直方图中的bin的位置。查询 模型直方图 中对应的bin -
- 并读取该bin的数值。将此数值储存在新的图像中(BackProjection)。 你也可以先归一化 模型直方图 ,这样测试图像的输出就可以在屏幕显示了。
通过对测试图像中的每个像素采用以上步骤, 我们得到了下面的 BackProjection 结果图:
例如,假如源图像是一张 肤色图,那么测试图像中亮色区域表示其更有可能属于皮肤区域(因为其对应的模型直方图值很高)。
调用函数 calcBackProject 计算图像的反向投影,示例见此。
OpenCV学习笔记(十) 直方图操作的更多相关文章
- OpenCV学习笔记十九:opencv_gpu*模块
一,简介: 基于GPU加速的opencv算法库.
- OpenCV学习笔记——形态学梯度操作
代码: #include<cv.h> #include<highgui.h> int main(void) { cvNamedWindow("cmp"); ...
- OpenCV学习笔记十八:opencv_flann模块
一,简介: Fast Library for Approximate Nearest Neighbors (FLANN)算法库.
- OpenCV学习笔记十六:opencv_calib3d模块
一,简介: 该库用于3D信息重建,姿态估计,摄像机标定等.
- OpenCV学习笔记十四:opencv_objdetect模块
一,简介: 该库用于目标检测.
- OpenCV学习笔记十五:opencv_features2d模块
一,简介: 该库用于2D特征检测,描述与匹配.
- OpenCV学习笔记十二:opencv_video模块
一,简介: 该库用于视频运动分析,目标追踪,背景分离等.
- OpenCV学习笔记十:opencv_superres模块
一,简介: 该库用于图像超分辨率重建.即通过硬件或软件的方法提高原有图像的分辨率,通过一系列低分辨率的图像来得到一幅高分辨率的图像.
- opencv学习笔记(六)直方图比较图片相似度
opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...
- python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...
随机推荐
- java(itext) 一个很简单的PDF表格生成工具
先上个效果图 因为做的项目涉及到数据预测,其中有大量打印业务来支撑实体店的运营,因为注重的是数据,要求简洁,清晰,所以写了个很简单也很实用的工具类. 如果需要编写样式或者插入背景,都可以查阅itex官 ...
- java8 peek
这样不会有任何的输出:Stream.of("one", "two", "three", "four").peek(e - ...
- JSPt的Base标签
<base href="${pageContext.request.contextPath}/"/> 注意:base标签得到的内容是: /projectName/ 这种 ...
- springMvc 添加定时任务
1.创建定时类 import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stere ...
- Regexp:常用的几个正则表达式
1.isEmail /** * * @desc 判断是否为邮箱地址 * @param {String} str * @return {Boolean} */ function isEmail(str) ...
- 关于echarts和jqeury的结合使用问题
今天在工作上遇到了一个小问题,就是自己在用echarts渲染了一个柱状图,然后点击其他位置,将渲染echart的div进行了清空,这里我所有的echart图形都是在同一个div中渲染的,然后当再次要求 ...
- 构建第一个spring boot2.0应用之项目启动运行的几种方式(二)
方法一. 配置Run/Debug Configuration 选择Main Class为项目 Application启动类(入口main方法) (2).进行项目目录,即包含pom.xml的目录下,启 ...
- CentOS下内核TCP参数优化配置详解
主动关闭的一方在发送最后一个ACK后就会进入TIME_WAIT状态,并停留2MSL(Max Segment LifeTime)时间,这个是TCP/IP必不可少的. TCP/IP的设计者如此设计,主要原 ...
- 【洛谷1110】[ZJOI2007] 报表统计(两棵平衡树)
点此看题面 大致题意: 有一个序列,三种操作.\(INSERT\)操作是在原数列第\(i+1\)个元素之前插入一个新元素\(k\),\(MIN\)\(GAP\)操作是查询相邻两个元素的之间差值的最小值 ...
- 【转】IOS开发网络篇之──ASIHTTPRequest详解
ASIHTTPRequest 详解, http 请求终结者 版权归旺财勇士所有〜转载需声名〜 原贴地地址:http://wiki.magiche.net/pages/viewpage.action?p ...