【 OpenCV】——灰度直方图

【 OpenCV】——灰度直方图


前言

本文介绍了灰度直方图的基础内容。


对函数参数的解释

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,//表示是否进行归一化,默认为true
bool accumulate=false //累计标识符(默认为false),主要是允许多从个阵列中计算单个直方图
//或者用于在特定的时间更新直方图
}

使用步骤

##1.引入库
#include
#include
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
	Mat img;
	img = imread("F:\\专高CV2\\图片\\520.jpg");
	imshow("原图", img);
	Mat hui;
	cvtColor(img, hui, CV_BGR2GRAY);
	int bins = 256;
	int hist_size[] = { bins };
	float range[] = { 0,256 };
	const float *ranges[] = { range };
	MatND hist;
	int channels[] = { 0 };
	//计算出灰度直方图
	calcHist(&hui, 1, channels, Mat(), hist, 1, hist_size, ranges);
	//画出直方图
	double max_val;
	minMaxLoc(hist, 0, &max_val, 0, 0);//定位矩阵中最小值、最大值的位置
	int scale = 2;
	int hist_height = 256;
	Mat hist_img = Mat::zeros(hist_height, bins*scale, CV_8UC3);//创建一个全0的特殊矩阵
	for (int i = 0; i < bins; i++)
	{
		float bin_val = hist.at<float>(i);
		int inten = cvRound(bin_val*hist_height / max_val);//要绘制高度
		//画矩形
		rectangle(hist_img, Point(scale*i, hist_height - 1), Point((i + 1)*scale - 1, hist_height - inten), CV_RGB(255, 255, 255));


	}
	imshow("灰度直方图", hist_img);
	waitKey(0);
}

效果图展示

【 OpenCV】——灰度直方图_第1张图片

总结

以上是一个简单的灰度直方图展示。

你可能感兴趣的:(c++,opencv)