• 直方图是对数据的统计,并将统计结果分布于一系列预定义的槽中。这里的数据不仅仅指的是灰度值,它可以是任何能有效描述图像特征的数据,比如图像梯度等等。

  • 假设有一个矩阵包含一张图像的信息 (灰度值 0-255),我们已经知道灰度值范围是0-255,假设有16个槽(bin),则有下面的划分:

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

  • 让我们再来了解一下直方图的一些具体细节:

    1. dims: 需要统计的特征的数目, 在上例中, dims = 1 因为我们仅仅统计了灰度值(灰度图像)。
    2. bins: 每个特征空间 子区段 的数目,在上例中, bins = 16
    3. 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)的更多相关文章

  1. OpenCV学习(27) 直方图(4)

    我们可以利用OpenCV的直方图,backproject直方图和meanshift算法来跟踪物体.下面通过简单的例子来说明如何实现跟踪算法,我们有两幅狒狒的图片,如下图所示:我们首先在左图中框选狒狒的 ...

  2. OpenCV学习(26) 直方图(3)

    本章中我们学习一下通过backproject直方图,得到一副图像中每个像素属于该直方图的概率.在下边原始图中(左图),我们框选了一块四边形的区域,计算该区域的灰度直方图,然后通过下面的函数calcBa ...

  3. OpenCV学习(25) 直方图(2)

    在OpenCV中,也可以对三通道的图像,比如BGR,HSV等计算直方图.方法和计算单通道图像直方图相似,下面的代码描述了如何计算一个BGR三通道图像的直方图,需要注意的是,因为是三通道,每个通道取值都 ...

  4. opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...

  5. OpenCV 学习笔记 07 目标检测与识别

    目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...

  6. opencv学习笔记(七)SVM+HOG

    opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...

  7. opencv学习笔记(一)IplImage, CvMat, Mat 的关系

    opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...

  8. paper 93:OpenCV学习笔记大集锦

    整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...

  9. (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU

          首页 视界智尚 算法技术 每日技术 来打我呀 注册     OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...

随机推荐

  1. python之web框架(2):了解WSGI接口

    python之web框架(2):了解WSGI接口 1.什么是wsgi接口: wsgi:Web Service Gateway Interface.它不是模块,而只是一种规范,方便web服务器和各种框架 ...

  2. sql developer连接mysql

    刚刚安装sql developer之后,数据库连接时没有mysql的选项,需要增加一个jar包 mysql-connector-java-6.0.5.zip 工具--->首选项--->数据 ...

  3. JAVA 并发编程-多个线程之间共享数据

    原文地址:http://blog.csdn.net/hejingyuan6/article/details/47053409# 多线程共享数据的方式: 1,如果每个线程执行的代码相同,可以使用同一个R ...

  4. redis在Linux下的远程连接

    1.redis在Linux下的远程连接: $ redis-cli -h host -p port -a password 如何连接到主机为 127.0.0.1,端口为 6379 ,密码为 mypass ...

  5. 【WIN10】Toast 通知

    DEMO下載:http://yunpan.cn/cFSLZQf5ePeTV  访问密码 1fce 1.顯示通知 使用xml確定通知內容. string xml = "<toast la ...

  6. BZOJ.2428.[HAOI2006]均分数据(随机化贪心/模拟退火)

    题目链接 模拟退火: 模拟退火!每次随机一个位置加给sum[]最小的组. 参数真特么玄学啊..气的不想调了(其实就是想刷刷最优解) 如果用DP去算好像更准.. //832kb 428ms #inclu ...

  7. Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition) D. Bear and Two Paths 构造

    D. Bear and Two Paths 题目连接: http://www.codeforces.com/contest/673/problem/D Description Bearland has ...

  8. Python学习笔记(三):随机生成函数方法

    本文是在Python2下总结! Python中的random模块用于生成随机数,如果想生成随机数需要先导入random的模块然后才能使用其中的方法,下面简单介绍一下常用的结果函数方法: 1·.rand ...

  9. centos7 docker安装和使用_入门教程

    说明:本文也是参考互联网上的文章写的,感谢相关作者的贡献. 操作系统 64位CentOS Linux release 7.2.1511 (Core) 配置好IP:192.168.1.160 修改yum ...

  10. LAMP架构之NFS

    需求分析: 前端需支持更大的访问量,单台Web服务器已无法满足需求了,则需扩容Web服务器: 虽然动态内容可交由后端的PHP服务器执行,但静态页面还需要Web服务器自己解析,那是否意味着多台Web服务 ...