像素值在图像中的分布情况是这幅图像的一个重要特征。直方图是一个简单的表,它给出了衣服图像或一组图像中拥有给定数值的像素数量。在OpenCV中计算直方图可以通过使用cv::clacHist()
函数。这是一个通用函数,可计算任意像素类型的多通道图像。我们可以编写函数将直方图使用柱状图可视化。
cv::clacHist()
函数允许你指定一个分布在几个图像中的多通道图像,所以函数要求的参数大多是数组。
cv::Mat getHistImg(const cv::Mat &img)
{
cv::MatND hist; //存储直方图的N维矩阵
int channels[1]={0}; //通道数
int size[1] = {256}; //项的数量
cv::Mat histImg(size[0],size[0],CV_8U,cv::Scalar(255)); //直方图柱状图
float hranges[2]={0,255}; //像素值范围
const float *ranges[0];
ranges[0]=hranges;
double maxVal=0,minVal=0;
cv::calcHist(&img,1,channels,cv::Mat(),hist,1,size,ranges);
cv::minMaxLoc(hist,&minVal,&maxVal); //获取最值
int hpt = 0.9*size[0]; //最高点为图像高的90%
//绘制垂直线
for(int i=0;i<size[0];i++)
{
float val = hist.at<float>(i);
int intensity = val*hpt/maxVal;
cv::line(histImg,cv::Point(i,size[0]),cv::Point(i,size[0]-intensity),cv::Scalar(0));
}
return histImg;
}