C++OpenCV下绘制直方图
直方图的定义:灰度直方图是对一幅灰度图像素分布的统计。对于一幅8Bit量化的图像来说。就是统计在0~255各个灰度级上,像素点的个数或者密度。
在OpenCV库提供了calcHist()方法用于得到图像的直方图。
具体函数的调用方法如下:
void cv::calcHist(const Mat*images,int nimages,const int *channels,InputArrary mask,OutputArrary hist,int dims,const int* histSize,const float **ranges,bool uniform=true,bool accumulate=false)
//参数说明
//images:带统计直方图的图像数组
//nimages:输入图像的数目
//channels:需要统计的通道索引数组 一般灰度图就是0通道
//mask:掩码 一般填Mat()
//hist:输出的统计直方图结果,是一个dims维度的数组。不过用OpenCV中Mat类型的变量存储
//dims:hist的列数、需要计算直方图的维度
//histSize:存放每个维度直方图数组的尺寸
//ranges:每个通道灰度值的取值范围
根据以上参数,设计了一个获取直方图Mat数组Hist的函数
//@para gray:需要统计的图   Hist:用于存放统计数据
void GetHist(Mat gray,Mat &Hist)    //统计8Bit量化图像的灰度直方图
{const int channels[1] = { 0 }; //通道索引float inRanges[2] = { 0,255 };  //像素范围const float* ranges[1] = {inRanges};//像素灰度级范围const int bins[1] = { 256 };   //直方图的维度calcHist(&gray, 1, channels,Mat(), Hist,1, bins, ranges);
}
这里得gray为测试灰度图。看下运行完calcHist函数后,Hist的维数。
可以看到Hist就是一个256行1列Mat类型的变量,可以看做一个数组索引。
这样我们就可以根据这个Hist画图。
这里设计一个ShowHist函数,主要的步骤就是申请一块背景为纯黑的图像,再根据Hist的值转化为点坐标从而画出一个个白色的矩形以完成直方图的绘制。
void ShowHist(Mat &Hist)
{//准备绘制直方图int hist_w = 512;int hist_h = 400;int width = 2;Mat histImage = Mat::zeros(hist_h,hist_w,CV_8UC3);   //准备histImage为全黑背景色,大小为512*400for (int i = 0; i < Hist.rows; i++){rectangle(histImage,Point(width*(i),hist_h-1),Point(width*(i+1),hist_h-cvRound(Hist.at<float>(i)/20)),Scalar(255,255,255),-1);}namedWindow("histImage", WINDOW_AUTOSIZE);imshow("histImage", histImage);//waitKey(0);
}
首先准备一幅512*400的全黑背景图histImage,接下来通过Hist.rows遍历每个灰度级的像素个数。通过Rectangle函数画出白色的矩形。最后的-1代表绘制的矩形是填充矩形。对于Rectangle,重点分析下两个Point的含义。
@param pt1 Vertex of the rectangle.
@param pt2 Vertex of the rectangle opposite to pt1 .
上面是官方给出的注释,pt1为矩形的一个顶点,pt2为矩形对角线上的另一个顶点。
首先看横坐标,一个矩形的横坐标长度应该为一个像素级所占的长度,这里我们假定一个像素级占长度为width=2。pt1的横坐标值为width*(i),pt2的横坐标值为width*(i+1);
再看纵坐标,首先需要明白图像的坐标系,它是这样的:
pt1的纵坐标为:hist_h-1相当于图像最下面,也就是矩形的左下角。pt2的纵坐标应该是矩形的右上角才对,hist_h-cvRound(Hist.at<float>(i)/20),cvRound是4舍5入,Hist.at<float>(i)取出在该像素级上像素点的个数,这个数字可能远远大于hist_h(512),因为直方图我们只希望看到图像像素级分布的大致,所以我们除以一个20保证不会超出图像的边界。
最后给出我主函数的调用:
int main(int argc,char *argv)
{Mat src,gray,hist;   //hist用于统计gray的直方图src=imread("2.jpg");cvtColor(src,gray,CV_BGR2GRAY);GetHist(gray,hist);ShowHist(hist);namedWindow("gray");imshow("gray",gray);waitKey(0);return 0;
}
结果:
总结分析:其实图像的直方图只能告诉我们图像像素级别的分布如何,可以定性的帮助我们判断图像对比度,以及亮度的分布情况,如果想通过直方图进行操作,还是得借助calcHist得到的Hist数组对其进行定量的操作。

C++OpenCV下绘制灰度直方图相关推荐

  1. OpenCV下的灰度直方图生成及显示的源码,带详细注释

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 注:本文的源码来自博客  http://blog ...

  2. OpenCV下设置灰度直方图的阈值来对图像进行查找(查表)变换的源码

    如果图像的直方图集中在某一区间,画面表现现的是色彩单一,不利于观察分析,这个时候我们就可以通过对直方图设置上下两个阈值,找到这两个阈值对应的灰度级,分别记为iLow和iHigh,小于iLow的像素点的 ...

  3. opencv python matplotlib.pyplot.hist() 如何绘制灰度直方图,如何根据灰度直方图确定最优二值化值

    什么是灰度直方图? 图像直方图(histogram)是图像的统计学特征,常用于了解图像的基本特征以便分析.不过图像的直方图不具有空间特征. 图像的灰度直方图(histogram),就是将图像转化成灰度 ...

  4. 【python图像处理】python绘制灰度直方图

    灰度直方图在数据统计分析.图像处理中有着比较广泛的应用,下面就介绍一下如何使用python来绘制灰度直方图. 下面直接看代码: import matplotlib.pyplot as plt impo ...

  5. python绘制灰度直方图_python+opencv 灰度直方图及其二值化

    图像直方图(histogram)是图像的统计学特征,常用于了解图像的基本特征以便分析.不过图像的直方图不具有空间特征. 图像的灰度直方图(histogram),就是将图像转化成灰度图像之后,统计各个像 ...

  6. 使用Opencv绘制灰度直方图/对比

    一.所需结构体 CvHistogram 结构体原型: typedef struct CvHistogram {int type; /* 直方图类型 */CvArr* bins; /* 直方图数据 */ ...

  7. OpenCV:实现灰度直方图和单通道直方图拉伸

    原文链接:http://blog.csdn.net/xiaowei_cqu/article/details/7600666 本文略有修改,如有疑问或者版权问题,请移步原作者或者告知本人. 直接贴代码: ...

  8. 如何用python绘制灰度直方图_python可视化

    基于pandas的内置可视化 基本绘图 Series和DataFrame上的这个功能只是使用matplotlib库的plot()方法的简单包装实现. %matplotlib inline import ...

  9. 如何用python绘制灰度直方图_python如何显示图像的灰度直方图-女性时尚流行美容健康娱乐mv-ida网...

    女性时尚流行美容健康娱乐mv-ida网 mvida时尚娱乐网 首页 美容 护肤 化妆技巧 发型 服饰 健康 情感 美体 美食 娱乐 明星八卦 首页 > 高级搜索 python opencv处理 ...

最新文章

  1. Fiddler使用技巧:强大的数据文本编解码功能
  2. 中科视拓开源SeetaFace2
  3. (1)51单片机NOP指令
  4. hdu As Easy As A+B
  5. 机器学习常用算法(LDA,CNN,LR)原理简述
  6. ObjectModel QML类型
  7. cadence中元件所在库
  8. C#控制台程序,发送邮件,可带附件
  9. 搭建移动端布局框架:整合flex
  10. php 5.5.12 服务器php.ini配置
  11. 【Mybatis】mapper文件的解析
  12. PES,TS,PS,RTP等流的打包格式解析之PES流
  13. maven配置以及设置国内镜像
  14. Kali linux 学习笔记(七十五)拒绝服务——teardrop 2020.4.15
  15. PBOOTCMS后台模板管理修改插件
  16. 小米嵌入式研发工程师校招面试总结
  17. 自动驾驶TPM技术杂谈 ———— 超声波雷达系统测距
  18. 懂了!运算放大器的工作原理
  19. 三星显示android recovery,三星手机怎么进入recovery模式?详细图文教程指导
  20. 【花雕动手做】有趣好玩的音乐可视化系列小项目(14)---水杯水瓶灯

热门文章

  1. 2011年10月12日
  2. 操作指南:备份软件 FreeFileSync
  3. 新的一年,Android开发程序员应该怎样突出重围?
  4. Scala Actor 读多文件
  5. 全国计算机考试满分是多少,计算机三级考试满分多少分
  6. python 彻底解读多线程与多进程
  7. QGroundControl无人机地面站 QGCToolbox
  8. mysql中的longblob类型处理
  9. 25.PIBOT的IMU校准
  10. ROS-Arduino-IMU6050 校准