使用opencv绘制灰度图像直方图

        图像直方图是图像处理中非常重要的像素统计结果。图像直方图不再表征任何的图像纹理信息,而是对图像像素的统计。

        在OpenCV4中,提供了图像直方图的统计函数calcHist(),该函数能够统计出图像中每个灰度值的个数,但是对于直方图的绘制需要我们自己进行。calcHist()函数原型如下所示:

void cv::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
                  )

下面为绘制灰度图像的图像直方图的完整示例:

#include 
#include 

using namespace cv;
using namespace std;

int main()
{
	Mat img = imread("G:\\书本内容\\OpenCV4快速入门\\learnOpenCV4-master\\data\\apple.jpg");
	if (img.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}
	Mat gray;
	cvtColor(img, gray, COLOR_BGR2GRAY);
	//设置提取直方图的相关变量
	Mat hist;  //用于存放直方图计算结果
	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);  //计算图像直方图
																//准备绘制直方图
	int hist_w = 512;
	int hist_h = 400;
	int width = 2;
	Mat histImage = Mat::zeros(hist_h, hist_w, CV_8UC3);
	for (int i = 1; i <= hist.rows; i++)
	{
		rectangle(histImage, Point(width*(i - 1), hist_h - 1),
			Point(width*i - 1, hist_h - cvRound(hist.at(i - 1) / 15)),
			Scalar(255, 255, 255), -1);
	}
	namedWindow("histImage", WINDOW_AUTOSIZE);
	imshow("histImage", histImage);
	imshow("gray", gray);
	waitKey(0);
	return 0;
}

程序运行结果:

使用opencv绘制灰度图像直方图_第1张图片

你可能感兴趣的:(图像处理,计算机视觉,c++)