【OpenCV3经典编程100例】(21)直方图处理:计算和绘制灰度图像的一维直方图、calcHist()函数

直方图是图像十分重要的特征,,是对数据进行统计的一种方法!直方图处理在数字图像处理中占着举足轻重的地位。

首先,我们利用calcHist()函数计算灰度图像的直方图,即统计灰度图中像素的灰度值0到255出现的次数。

然后绘制一维直方图,观察直方图我们可以得到很多关于图像特征的信息。

API函数:

void calcHist(const Mat* images,//输入图像
		int nimages,//输入图像个数
		const int* channels,//需要统计的通道的索引
		InputArray mask,//可选的操作掩码
		OutputArray hist,//输出的目标直方图
		int dims,//直方图的维度
		const int* histSize,//每个维度中,直方图数组的长度,量化成histSize个等级,即直条个数
		const float** ranges,//数组的数组,数据(像素的灰度值)的取值范围
		bool uniform = true, bool accumulate = false);//默认

一、c++示例代码

//包含头文件
#include <opencv2/opencv.hpp>
//命名空间
using namespace cv;
using namespace std;
//全局函数声明部分

//主函数
int main()
{
	//【1】载入图像
	Mat image = imread("G:\\opencvtest\\testImage\\airplane.jpg", 0);
	//【2】检查是否载入成功
	if (image.empty())
	{
		printf("读取图片错误,请确认目录下是否有imread函数指定图片存在! \n ");
		return 0;
	}
	//【3】计算灰度图像一维直方图
	const int nimages = 1;
	int channels[] = {0};
	MatND hist;
	int dims = 1;
	int histSize[] = {256};
	float hranges[] = {0.0, 255.0}; 
	const float* ranges[] = {hranges};//一定要有const
	calcHist(&image, nimages, channels, Mat(), hist, dims, histSize, ranges);
	//【4】获取最大最小值
	double minValue = 0;
	double maxValue = 0;
	minMaxLoc(hist, &minValue, &maxValue);
	//【5】绘制灰度图像一维直方图
	Mat dstImage(histSize[0], histSize[0], CV_8U, Scalar(0));//256*256的黑色底板
	int hpt = saturate_cast<int>(0.9 * histSize[0]);
	for (int i = 0; i < 256; i++)
	{
		float binValue = hist.at<float>(i);
		//统计数值的缩放,增强直方图的可视化
		int realValue = saturate_cast<int>(binValue * hpt / maxValue);
		//在256*256的黑色底板上画矩形
		rectangle(dstImage, Point(i, histSize[0]-1), Point(i+1, histSize[0]-realValue), Scalar(255));
	}
	//【6】显示图像
	imshow("21-灰度原图", image);
	imshow("21-一维直方图", dstImage);
	//【7】保持窗口显示
	waitKey(0);
	return 0;
}

二、运行截图

1.灰度原图


2.一维直方图


猜你喜欢

转载自blog.csdn.net/misterjiajia/article/details/80454165