Opencv中直方图函数calcHist

calcHist函数在Opencv中是极难理解的一个函数,一方面是参数说明晦涩难懂,另一方面,说明书给出的实例也不足以令人完全搞清楚该函数的使用方式。最难理解的是第6,7,8个参数dims、histSize和ranges。以前一直都是想当然认为,该函数可以一次统计多张图片每个通道的灰度值数据,实际上calcHist函数一次只能统计一个通道上的直方图。我估计许多同学都犯过和我类似的错误,认为第5个参数hist,可以根据dims设定维度,比如dims=3,则输出的hist的维度就是3,并且会想当然的认为这个三维矩阵会保存三个通道上的直方图统计,悲哀的是,错了。它实际上是在三维坐标上统计的直方图,比如以第0个通道的灰度值有效统计范围(比如0~255)作为纵坐标,类似于笛卡尔坐标的y轴;以第1个通道灰度值统计有效范围作为横坐标,类似于笛卡尔坐标的x轴;以第2个通道的灰度值有效统计范围作为z轴。这三个轴坐标作为统计的依据。比如坐标(6,7,8),表示统计满足“0通道上灰度值为1;1通道上灰度为7;2通道上灰度为8的像素”,在整个图像上的像素个数。

当然,当dims=1时,就好理解了,就是对某一个单一通道上的灰度值直方图统计。

calcHist函数的声明如下:

OpenCV提供了两个重载的calcHist函数,它可以计算一系列阵列的直方图,这些系列通常是图像或像平面。它最多可以同时处理32个图像。

C++: 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 )

C++: void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, SparseMat& hist, int dims, const int* histSize, const float** ranges, bool uniform = true, bool accumulate= false )

参数说明:

images –  源图像数组,它们有同样的位深CV_8U或 CV_32F ,同样的尺寸;图像阵列中的每一个图像都可以有任意多个通道

nimages –  源图像的数目。

channels – 维度通道序列,第一幅图像的通道标号从0~image[0].channels( )-1。Image[0]表示图像数组中的第一幅图像,channels()表示该图像的通道数量。同理,图像阵列中的第二幅图像,通道标号从image[0].channerls( )开始,到image[1].channels( )-1为止;第三、四幅图像的通道标号顺序依此类推;也就是说图像阵列中的所有图像的通道根据图像排列顺序,排成一个通道队列。

mask –    可选择的mask。如果该矩阵不空的话,它必须是一个8-bit的矩阵,与images[i]同尺寸。在图像中,只有被mask覆盖的区域的像素才参与直方图统计。如果这个参数想用默认值,输入Mat()就可以了。

hist –      输出直方图, 它是一个稠密或稀疏矩阵,具有dims个维度;

dims –     直方图的维度,一定是正值, CV_MAX_DIMS(当前OpenCV版本是32个);

histSize –   数组,即histSize[i]表示第i个维度上bin的个数;这里的维度可以理解为通道。

ranges –   ranges是多个二元数组组成的数组。当在每个维度(或通道)上每个直方条等宽时,即uniform=true,灰度值的有效统计范围的下界用L0表示,上界用UhistSize[i]-1表示,角标中的i表示第i个维度(或通道),上下界值可以表示为hrange[i]={ L0, UhistSize[i]-1}, 而ranges={ hrange[0], hrange[1], …… , hrange[dims]}。ranges的元素个数由参数dims决定。

其中,L0表示在该通道上第0个直方条(bin)的下边界,表示第UhistSize[i]-1个直方条的上边界c。在该维度上直方条的个数为histSize[i],如bin[0]={ L0,
UhistSize[0]}, bin[1]={ L1, UhistSize[1]}, bin[2]={
L2, UhistSize[2]}, …… , bin[]={ L0, UhistSize[0]},

当uniform=false时,ranges中的每个元素ranges[i]都是一个多元数组,元素个数为histSize[i]+1,它们分别是:L0 , U0=L1, U1= L2,
…… ,UhistSize[i]-2 , LhistSize[i]-1 , UhistSize[i]-1
。所以,ranges[i]={ L0 , L1, L2, …… , LhistSize[i]-1 ,UhistSize[i]-1}

uniform –  标识,用于说明直方条bin是否是均匀等宽的。

accumulate – 累积标识。如果该项设置,当直方图重新分配时,直方图在开始清零。这个特征可以使你通过几幅图像,累积计算一个简单的直方图,或者及时更新直方图。

函数calcHist可以计算一幅或多幅图像的直方图。在元组中增量一个直方图的时候,就是从输入图像组中的原位置提取一幅图像,并计算出它的直方图,并添加到元组中。

当参数dims>1时,输出矩阵Hist是二维矩阵。

原文地址:https://www.cnblogs.com/phoenixdsg/p/8280362.html

时间: 2024-10-29 03:30:13

Opencv中直方图函数calcHist的相关文章

【计算机视觉】OpenCV中直方图处理函数简述

计算直方图calcHist 直方图是对数据集合的统计 ,并将统计结果分布于一系列预定义的bins中.这里的数据不仅仅指的是灰度值 ,统计数据可能是任何能有效描述图像的特征. 假设有一个矩阵包含一张图像的信息 (灰度值 0-255): gray 既然已知数字的范围包含256个值, 我们可以将这个范围分割成子区域(称作 bins),如: bins 然后再统计掉入每一个bin_{i}的像素数目.采用这一方法来统计上面的数字矩阵,我们可以得到下图( x轴表示 bin, y轴表示各个bin中的像素个数).

Opencv+Python(3):在Opencv中绘制函数

在OpenCV中绘制函数 目标 学习使用OpenCV绘制不同的几何形状 你将学习这些函数:cv2.line(),cv2.circle(),cv2.rectangle(),cv2.ellipse(),cv2.putText()等 码 在所有上述功能中,您将看到如下所示的一些常见参数: img:想要绘制形状的图像 颜色:形状的颜色.对于BGR,将它作为元组传递,例如:(255,0,0)for blue.对于灰度,只需传递标量值即可. 厚度:线或圆的厚度等.如果像圆圈这样的闭合数字传递-1,它将填充形

5. openCV中常用函数学习

一.前言 经过两个星期的努力,一边学习,一边写代码,初步完成的毕业论文系统的界面和一些基本功能,主要包括:1 数据的读写和显示,及相关的基本操作(放大.缩小和移动):2 样本数据的选择:3 数据归一化处理:4 绘制光谱曲线:5 获取波段信息.接下来的工作主要是完成遥感影像分类的相关算法.这部分主要是数学计算,尤其是矩阵的相关运算和操作.为此,系统的学习和了解了openCV库中常用的矩阵操作函数,记录下来,方便以后查阅. 二.openCV函数 1 reshape 1 C++: Mat Mat::r

【短道速滑一】OpenCV中cvResize函数使用双线性插值缩小图像到长宽大小一半时速度飞快(比最近邻还快)之异象解析和自我实现。

今天,一个朋友想使用我的SSE优化Demo里的双线性插值算法,他已经在项目里使用了OpenCV,因此,我就建议他直接使用OpenCV,朋友的程序非常注意效率和实时性(因为是处理视频),因此希望我能测试下我的速度和OpenCV相比到底那一个更有速度优势,恰好前一段时间也有朋友有这方面的需求,因此我就随意编写了一个测试程序,如下所示: IplImage *T = cvLoadImage("F:\\1.JPG"); IplImage *SrcImg = cvCreateImage(cvSiz

openCV中cvSnakeImage()函数代码分析

/*M/////////////////////////////////////////////////////////////////////////////////////// // // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. // // By downloading, copying, installing or using the software you agree to this licen

OpenCV中approxPolyDP()函数

CV_EXPORTS_W void approxPolyDP( InputArray curve, OutputArray approxCurve, double epsilon, bool closed ); @param curve Input vector of a 2D point stored in std::vector or Mat@param approxCurve Result of the approximation. The type should match the ty

图像边缘检测--OpenCV之cvCanny函数

图像边缘检测--OpenCV之cvCanny函数 分类: C/C++ void cvCanny( const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture_size=3 ); image单通道输入图像.edges单通道存储边缘的输出图像threshold1第一个阈值threshold2第二个阈值aperture_sizeSobel 算子内核大小 (见 cvSobel). 函数 cvCa

opencv 边界确定函数

多边形逼近,用嘴贴切的多边形标识 void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed): InputArray curve:输入的点集 OutputArray approxCurve:输出的点集,当前点集是能最小包容指定点集的.draw出来即是一个多边形: double epsilon:指定的精度,也即是原始曲线与近似曲线之间的最大距离. bool closed:若为tr

由lib引发的血案(opencv找不函数问题)

在使用opencv中的函数时,连续两次遇到函数找不到的问题,第一次查时按照他人说的包含进一个头文件后,果真还真解决了:然而第二次在调用cvInpaint函数时包含进对应头文件,编译通过但运行不成功还是未定义标识符.在网上搜了之后才真正理解了原因,某个函数找不到主要是由于debug和release库文件没有选择完全. 解决办法:先加入debug和release缺少的库文件后,然后再include进包含该函数声明的头文件即可调用.eg:cvInpaint找不到. 在配置属性的时候,在连接器->输入