OpenCV学习(24) 直方图(1)
直方图是对数据的统计,并将统计结果分布于一系列预定义的槽中。这里的数据不仅仅指的是灰度值,它可以是任何能有效描述图像特征的数据,比如图像梯度等等。
假设有一个矩阵包含一张图像的信息 (灰度值 0-255),我们已经知道灰度值范围是0-255,假设有16个槽(bin),则有下面的划分:

我们可以统计落入每个槽中像素的数目,并用直方图的形式显示出来。

让我们再来了解一下直方图的一些具体细节:
- dims: 需要统计的特征的数目, 在上例中, dims = 1 因为我们仅仅统计了灰度值(灰度图像)。
- bins: 每个特征空间 子区段 的数目,在上例中, bins = 16
- range: 每个特征空间的取值范围,在上例中, range = [0,255]
怎样去统计两个特征呢? 在这种情况下, 直方图就是3维的了,x轴和y轴分别代表一个特征, z轴是掉入
组合中的样本数目, 同样的方法适用于更高维的情形 (超过2维的很难用可视化的方式显示出来)。
下面是读取一副图像的灰度图,然后显示它的灰度值统计直方图的代码:
int main( int argc, char** argv )
{
Mat src, dst; /// 以单通道方式打开图像
src = imread( "../lenna.jpg", 0); if( !src.data )
{ return -1; } /// 设定bin数目
int histSize[1] = {255}; /// 设定取值范围 ( R,G,B) )
float range[] = { 0, 255 } ;
const float* histRange = { range }; bool uniform = true; bool accumulate = false; //结果直方图
Mat hist; calcHist( &src, 1, 0, Mat(), hist, 1, histSize, &histRange, uniform, accumulate ); // 创建直方图画布
int hist_w = 512;
int hist_h = 512;
//计算每个bin的像素宽度
int bin_w = cvRound( (double) hist_w/histSize[0] ); Mat histImage( hist_w, hist_h, CV_8UC3, Scalar( 0,0,0) ); /// 将直方图归一化到范围 [ 0, histImage.rows ]
normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() ); /// 在直方图画布上画出直方图,线宽为bin_w
for( int i = 0; i < histSize[0]; i++ )
{
line( histImage, Point( bin_w*(i), hist_h - cvRound(hist.at<float>(i)) ) ,
Point( bin_w*(i), hist_h),
Scalar( 0, 0, 255), bin_w, 8, 0 );
} /// 显示直方图
namedWindow("calcHist Demo", CV_WINDOW_AUTOSIZE );
imshow("calcHist Demo", histImage ); waitKey(0); return 0; }
OpenCV中的直方图计算函数,参数比较多,第一个参数是指向图像矩阵的指针,之所以是指针,是因为OpenCV中,可以统计多个图像的直方图,并把结果累加起来,我们的代码中只有一副图像,所以取&src。第二个参数就是指统计图像的数量,本程序中为1。第三个参数表示对某个通道进行直方图统计,我们读入的是灰度图,只有一个通道,所以值为0 。第四个参数是掩码。第五个参数是输出的直方图结果矩阵。第六个参数是直方图的维数。第七个参数是每个维度的取值范围,我们是单通道图像灰度值直方图,所以取值范围是[0 ,255],通常这个参数是个二维指针。
//计算直方图
//第二个参数1表示只对一副图像进行直方图处理
//第三个参数表示只处理channel 0,对多个channel的图像,可以选1,2等等。
//第四个参数Mat(),表示不使用掩码
//hist是直方图结果
//第六个参数1表示是1维直方图
//第七个参数,直方图bin的数目
//第八个参数是像素取值范围,第九个参数是各维取值范围相同,第十个参数是是否累加多副图像的统计结果,如果处理多个图像,需要这个参数。
calcHist( &src, 1, 0, Mat(), hist, 1, histSize, &histRange, uniform, accumulate );
程序执行后效果如下:

程序源代码:工程文件FirstOpenCV18
OpenCV学习(24) 直方图(1)的更多相关文章
- OpenCV学习(27) 直方图(4)
我们可以利用OpenCV的直方图,backproject直方图和meanshift算法来跟踪物体.下面通过简单的例子来说明如何实现跟踪算法,我们有两幅狒狒的图片,如下图所示:我们首先在左图中框选狒狒的 ...
- OpenCV学习(26) 直方图(3)
本章中我们学习一下通过backproject直方图,得到一副图像中每个像素属于该直方图的概率.在下边原始图中(左图),我们框选了一块四边形的区域,计算该区域的灰度直方图,然后通过下面的函数calcBa ...
- OpenCV学习(25) 直方图(2)
在OpenCV中,也可以对三通道的图像,比如BGR,HSV等计算直方图.方法和计算单通道图像直方图相似,下面的代码描述了如何计算一个BGR三通道图像的直方图,需要注意的是,因为是三通道,每个通道取值都 ...
- opencv学习笔记(六)直方图比较图片相似度
opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...
- OpenCV 学习笔记 07 目标检测与识别
目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...
- opencv学习笔记(七)SVM+HOG
opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...
- opencv学习笔记(一)IplImage, CvMat, Mat 的关系
opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...
- paper 93:OpenCV学习笔记大集锦
整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...
- (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU
首页 视界智尚 算法技术 每日技术 来打我呀 注册 OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...
随机推荐
- Ionic入门九:颜色
ionic 提供了很多颜色的配置,当然你可以根据自己的需要自定义颜色. <ul class="list color-list-demo"> <li class=& ...
- 部署 LAMP
部署 LAMP https://help.aliyun.com/document_detail/50774.html?spm=a2c4g.11186623.6.773.Em8xVc 文档提供方:上海驻 ...
- BZOJ2152 [国家集训队] 聪聪可可 [点分治]
题目传送门 聪聪可可 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 5237 Solved: 2750[Submit][Status][Discuss ...
- Java反射机制demo(三)—获取类中的构造函数
Java反射机制demo(三)—获取类中的构造函数 1,获取类中所有的构造函数 如下面的代码中所示,这个类中显式的构造函数有五个. 空构造: public UserInfo() 带参构造有四个: pu ...
- HTTP请求的GET与POST方式的区别
Form中的get和post方法,在数据传输过程中分别对应了HTTP协议中的GET和POST方法.二者主要区别如下: 1)Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据: 2)Ge ...
- [ 原创 ]linux centos下配置java环境教程
一.环境 centos 7.2 二.目标 在CentOS7.2上安装jdk1.8(tar.gz安装包),并配置环境变量 jdk安装在/home/soft/jdk1.8.0-131目录下 具体步骤 1. ...
- 选择排序之C++实现
选择排序之C++实现 一.源代码:SelectSort.cpp /* 选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置: 然后,选出第二小的数,放在第二个位置: 以此类推,直到所有 ...
- vijos p1768 数学
链接:点我 预处理:b[i][j]表示a[1] ... a[j]中比a[i]小的数的数量. 设 int get_lower_count(int b[], int l, int r) { return ...
- SQL SERVER中获取表间主外键关系
sql server 2008中的主外键关系获取方式: 转自:http://www.cnblogs.com/ke10/archive/2012/06/11/2544655.html SELECT OB ...
- [LeetCode] Max Points on a Line 题解
题意 Given n points on a 2D plane, find the maximum number of points that lie on the same straight lin ...