1.直方图:直方图是一个简单的表,它给出了一幅图像或者一组图像中拥有给定数值的像素数量,因此,灰度图像的直方图有256个条目(或称为容器),0号容器给出像素值为0的像素个数、1号容器给出……;对直方图的所有项求和会得到像素的总数;直方图也可以归一化,归一化后所有项的和为1,每一项就成为了比例。
2.
//计算图像的直方图和表示为柱状图
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
class Histogram1D{
private:
int histSize[1]; //直方图项的数量
float hranges[2]; //像素的最大值和最小值
const float* ranges[1];
int channels[1]; //仅用到一个通道
public:
Histogram1D(){
//准备1D直方图的参数
histSize[0] = 256;
hranges[0] = 0.0;
hranges[1] = 255.0;
ranges[0] = hranges;
channels[0] = 0; //默认情况考察0号通道
}
MatND getHistogram(const Mat image){
MatND hist;
calcHist(&image, 1, channels, Mat(), hist, 1, histSize, ranges);
return hist;
}
Mat getHistogramImage(const Mat &image){
MatND hist = getHistogram(image); //首先计算直方图
double maxVal = 0;
double minVal = 0;
minMaxLoc(hist, &minVal, &maxVal, 0, 0);
Mat histImg(histSize[0], histSize[0], CV_8U, Scalar(255));
int hpt = static_cast<int>(0.9*histSize[0]);
for (int h = 0; h < histSize[0]; h++){
float binVal = hist.at<float>(h);
int intensity = static_cast<int>(binVal*hpt/maxVal);
line(histImg, Point(h, histSize[0]), Point(h, histSize[0] - intensity), Scalar::all(0));
}
return histImg;
}
};
int main()
{
/*Mat image = imread("lifehappy.png",0);
Histogram1D h;
MatND histo = h.getHistogram(image);//计算直方图
for (int i = 0; i < 256; i++){
cout << "Value" << i << "=" << histo.at<float>(i) << endl;
}
waitKey(20150901);
system("pause");
return 0;*/
Mat image = imread("lifehappy.png",0);
Histogram1D h;
namedWindow("Histogram");
imshow("Histogram",h.getHistogramImage(image));
system("pause");
return 0;
}