一、具体代码表示
ps:代码中有详细注释
/**
* 绘制直方图:直方图是变量分布的统计图形表示,它让我们能够理解数据的密度估计和概率分布。
* 直方图通过将整个变量值范围划分为小的值范围,然后计算每个间隔中落入多少个值来创建
* @param inputImagePath 绘制直方图的原图路径
*/
void showCalcHist(char *inputImagePath) {
//加载原图
Mat src = imread(inputImagePath);
if (src.empty()) {
cout << "图像数据不存在" << endl;
return;
}
//将原图进行拆分,并存入向量集合中
vector<Mat> bgr;
//将输入图像划分为三个通道R、G、B
split(src, bgr);
//设置直方图有256个区间,因为图像的灰度值变化为0~255
int numbers = 256;
//定义变量范围,并定义三个矩阵来存储每个直方图
float range[] = {0, 256};
const float *histRange = {range};
Mat b_hist, g_hist, r_hist;
/*
* calcHist用来计算图像直方图:
* 参数详解:
const Mat* images:输入图像
int nimages:输入图像的个数
const int* channels:需要统计直方图的第几通道
InputArray mask:掩膜,,计算掩膜内的直方图 ...Mat()
OutputArray hist:输出的直方图数组
int dims:需要统计直方图通道的个数
const int* histSize:指的是直方图分成多少个区间,就是 bin的个数
const float** ranges: 统计像素值得区间
bool uniform=true::是否对得到的直方图数组进行归一化处理
bool accumulate=false:在多个图像时,是否累计计算像素值得个数
*/
calcHist(&bgr[0], 1, 0, Mat(), b_hist, 1, &numbers, &histRange);
calcHist(&bgr[1], 1, 0, Mat(), g_hist, 1, &numbers, &histRange);
calcHist(&bgr[2], 1, 0, Mat(), r_hist, 1, &numbers, &histRange);
//计算出每个通道的直方图后绘制直方图,并显示给用户
int width = 512;
int height = 320;
//创建一个灰度图像
Mat histImage(height, width, CV_8UC3, Scalar(20, 20, 20));
//
normalize(b_hist, b_hist, 0, height, NORM_MINMAX);
normalize(g_hist, g_hist, 0, height, NORM_MINMAX);
normalize(r_hist, r_hist, 0, height, NORM_MINMAX);
int binStep = cvRound((float )width/(float )numbers);
for(int i=0;i<numbers;i++){
try {
line(
histImage,
Point(binStep*(i-1),height- cvRound(b_hist.at<float>(i-1))),
Point(binStep*(i),height- cvRound(b_hist.at<float>(i))),
Scalar(255,0,0)
);
line(
histImage,
Point(binStep*(i-1),height- cvRound(g_hist.at<float>(i-1))),
Point(binStep*(i),height- cvRound(g_hist.at<float>(i))),
Scalar(0,255,0)
);
line(
histImage,
Point(binStep*(i-1),height- cvRound(r_hist.at<float>(i-1))),
Point(binStep*(i),height- cvRound(r_hist.at<float>(i))),
Scalar(0,0,255)
);
}catch (Exception exception){
cout << exception.err <<endl;
}
}
//展示原图
imshow("src",src);
//展示直方图
imshow("histWindow",histImage);
//销毁原始图像
src.release();
waitKey(0);
//销毁原图和直方图的两个窗口
destroyWindow("src");
destroyWindow("histWindow");
}
二、图片效果展示
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓