opencv之直方图计算(代码分享)

直方图(Histogram)又称柱状图、质量分布图,是一种统计报告图。直方图由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型,纵轴表示分布情况。在图像处理上,直方图是图像信息统计的有力工具。

具体可以通过以下几个相关的API进行实现:

split(// 把多通道图像分为多个单通道图像,const Mat &src //输入图像,Mat* mvbegin)// 输出的通道图像数组


calcHist(
 const Mat* images,//输入图像指针
int images,// 图像数目
const int* channels,// 通道数
InputArray mask,// 输入mask,可选,不用
OutputArray hist,//输出的直方图数据
int dims,// 维数
const int* histsize,// 直方图级数
const float* ranges,// 值域范围
bool uniform,// true by default
bool accumulate// false by defaut
)


详细代码分享:

#include <opencv2/opencv.hpp>

#include <iostream>


using namespace std;
using namespace cv;


int main(){
Mat src = imread("D:/photo/22.jpg");
if (src.empty())
{
cout << "open no success!" << endl;
return -1;
}
imshow("input image", src);


//cvtColor(src, src, CV_BGR2GRAY);灰度图转换
/*Mat dst;
equalizeHist(src, dst);直方图对比度放大
imshow("output image", dst);*/

//Mat dst_num[3];
vector<Mat> dst_num;//建立单通道数组
split(src, dst_num);//将多通道图片分解成单通道图片

int histsize = 256;//直方图分级数
float range[] = {0, 256};//像素范围
const float *histRange = {range};//范围指针
Mat b_hist, g_hist, r_hist;//建立分量直方图
//进行直方图提取
calcHist(&dst_num[0], 1, 0, Mat(), b_hist, 1, &histsize, &histRange, true, false);
calcHist(&dst_num[1], 1, 0, Mat(), g_hist, 1, &histsize, &histRange);
calcHist(&dst_num[2], 1, 0, Mat(), r_hist, 1, &histsize, &histRange);
//通过图片进行显示,直方图提取出来是单通道数组形式
int hist_w = 512;
int hist_h = 400;
int bin_w = hist_w / histsize;
Mat hist_image(hist_w, hist_h, CV_8UC3, Scalar(0,0,0));
normalize(b_hist, b_hist, 0, hist_h, NORM_MINMAX);
normalize(g_hist, g_hist, 0, hist_h, NORM_MINMAX);
normalize(r_hist, r_hist, 0, hist_h, NORM_MINMAX);

for (int i = 1; i < histsize; i++)
{
line(hist_image, Point((i-1) * bin_w, hist_h - cvRound(b_hist.at<float>(i-1))), Point((i) * bin_w, hist_h - cvRound(b_hist.at<float>(i))), Scalar(255, 0, 0), 2);
line(hist_image, Point((i-1) * bin_w, hist_h - cvRound(g_hist.at<float>(i-1))), Point((i) * bin_w, hist_h - cvRound(g_hist.at<float>(i))), Scalar(0, 255, 0), 2);
line(hist_image, Point((i-1) * bin_w, hist_h - cvRound(r_hist.at<float>(i-1))), Point((i) * bin_w, hist_h - cvRound(r_hist.at<float>(i))), Scalar(0, 0, 255), 2);
}
cout << b_hist.at<float>(25) << endl;
imshow("hist image", hist_image);




waitKey(0);
return 0;

}



猜你喜欢

转载自blog.csdn.net/qq_37596943/article/details/80296005
今日推荐