目录
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 };//取值区间