您的位置:首页 > 运维架构

OpenCV环境下计算并绘制灰度直方图的源码!

2017-09-20 17:06 417 查看
本文转自 http://opencv66.net/thread-15-1-1.html

图像的直方图是图像进行运算时的一个重要的数据特征,许多算法都需要用到图像的直方图数据,OpenCV提供了函数calcHist用来计算图像的直方图数据。这个函数的参数较多,下面介绍这个函数。

calcHist的原型如下:

void calcHist(const Mat* images, int nimages,const int* channels, InputArray mask,OutputArray hist, int dims,const int* histSize,const float** ranges, bool uniform = true, bool accumulate = false);

参数意义如下:

images:源图像数组,数组内的图片应该有相同的深度和大小,图像深度只能是CV_8U或CV_32F,通道数可以不同,注意这个参数是指针。

nimages:要计算图像的个数。

channel:计算哪些通道的直方图。通道编号方法:第一张图的通道编号为0至images[0].channels()-1,第二张图的通道编号为images[0].channels()至images[0].channels() + images[1].channels()-1,以此类推,注意这个参数是指针。

mask:掩码阵列。掩码中的非0元素对应的图像元素将会被计算,0元素则被屏蔽不参与计算。掩码阵列可以为空。

hist:直方图计算结果存储阵列。

dims:直方图的维度,比如灰度图的直方图为1维,H-S直方图为2维,以此类推,最大不超过CV_MAX_DIMS,目前CV_MAX_DIMS=32。

histSize:各个维度的大小。

ranges:存储每个维度的统计范围。

uniform:直方图是否均匀化的标志,意义暂时不清楚,等以后搞清楚了再来补充说明。

accumulate:记忆标志。表示这个函数空间被再次调用前是否清零,如果不清零,则可以使得用户存储多张图的直方图数据,或者对之前的计算过的直方图进行更新。
OpenCV下计算并绘制直方图的代码如下:
源代码请访问原帖查看,链接是 http://opencv66.net/thread-15-1-1.html

源代码请访问原帖查看,链接是 http://opencv66.net/thread-15-1-1.html

源代码请访问原帖查看,链接是 http://opencv66.net/thread-15-1-1.html

代码说明:

代码中用到了line函数来绘制直方图,这里给出它的原型,大家看下原型再结合原型自然就明白了怎么用了。

void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,int thickness = 1, int lineType = LINE_8, int shift = 0);

另外,大家要注意,在opencv中,坐标原点在左上角,也就是说向下为y轴正方向,所以代码中为了大家的阅读习惯还对图像进行了一次翻转处理。翻转部分代码的原理请大家参看帖子http://opencv66.net/thread-3-1-1.html
代码运行结果截图如下:



本文转自 http://opencv66.net/thread-15-1-1.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  直方图 calcHist line