OpenCV之直方图绘制(calcHist函数详解)

1.直方图的定义

要理解直方图,绕不开“亮度”这个概念。人们把亮度分为0到255共256个数值,数值越大,代表的亮度越高。其中0代表纯黑色的最暗区域,255表示最亮的纯白色,而中间的数字就是不同亮度的灰色。人们还进一步把这些亮度分为了5个区域,分别是黑色,阴影,中间调,高光和白色。
在这里插入图片描述
在图像处理上,直方图是图像信息统计的有力工具。其实也就是统计一幅图某个亮度像素数量。

2.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:输入的图像的指针;
• nimages:输入图像个数;
• channels:需要统计直方图的第几通道;
• mask:掩模,mask必须是一个8位(CV_8U)的数组并且和images的数组大小相同;
• hist:直方图计算的输出值;
• dims:输出直方图的维度(由channels指定);
• histSize:直方图中每个dims维度需要分成多少个区间(如果把直方图看作一个一个竖条的话,就是竖条的个数);
• ranges:统计像素值的区间;
• uniform=true:是否对得到的直方图数组进行归一化处理;
• accumulate=false:在多个图像时,是否累积计算像素值的个数;

【注】:在计算图像直方图的时候一般配合minMaxLoc()和normalize()函数一起使用。

3.绘制直方图

只看函数说明肯定看不明白,下面来对函数进行代码演示。绘制直方图主要有三步:

3.1 读取原图像并检查图像是否读取成功

相关代码如下:

Mat src, gray;
src = imread("D:/Desktop/16.png");
if (!src.data)
{
   
	cout << "读取图片错误,请重新输入正确路径!\n";
	system("pause");
	return -1;
}
cvtColor(src, gray, CV_BGR2GRAY);//转换为灰度图像
imshow("【灰度图】", gray);

当然,如果觉得麻烦,可以直接用以下代码代替:

Mat src, gray;
grayImage = imread("D:/Desktop/16.png",0);
imshow("【灰度图】", gray);

3.2 定义直方图参数并计算直方图

//需要计算的图像的通道,灰度图像为0,BGR图像需要指定B,G,R
	const int channels[] = {
    0 };
	Mat hist;//定义输出Mat类型
	int dims = 1;//设置直方图维度
	const int histSize[] = {
    256 }; //直方图每一个维度划分的柱条的数目
	//每一个维度取值范围
	float pranges[] = {
    0, 255 };//取值区间
	
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wendy_ya

您的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值