一、具体代码表示,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"); }
二、图片展示