图像由像素构成,每个像素有不同的数值。在单通道灰度图像中,每个像素的数值在0(黑色)~255(白色)之间分布。直方图是一个简单的表格,表示一个图像中具有某个值的像素数量。以灰度图像为例,直方图是一幅横轴表示灰度值(0~255)的分布,纵轴表示图像中对应灰度值的像素的数目,也可以说,灰度直方图有256个箱子(bin),0号箱子提供值为0的像素的数量,1号箱子提供灰度值为1的像素的数量......以此类推。
计算图像直方图(以一幅灰度图像为例)
<span style="font-family:Times New Roman;font-size:14px;">//创建灰度图像的直方图</span>
<span style="font-family:Times New Roman;font-size:14px;">class Histogram1D {
private:</span>
<span style="font-family:Times New Roman;font-size:14px;">
int histSize[1];//直方图中箱子的数量
float hranges[2];//值范围
const float* ranges[1];//值范围的指针
int channels[1];//要检查的通道数
public:
Histogram1D() {
// 初始化一维直方图的默认参数
histSize[0]= 256;
hranges[0]= 0.0;
hranges[1]= 255.0;
ranges[0]= hranges;
channels[0]= 0; // 先关注通道,灰度图像代表图像的通道数为1,因此这边为通道0
}
// 设置需要计算的通道,默认为通道0
void setChannel(int c) {
channels[0]= c;
}
int getChannel() {
return channels[0];
}
// 设置直方图的横轴范围,默认为</span><span style="font-family: 'Times New Roman'; font-size: 14px;">[0,255]</span><span style="font-family:Times New Roman;font-size:14px;">
void setRange(float minValue, float maxValue) {
hranges[0]= minValue;
hranges[1]= maxValue;
}
float getMinValue() {
return hranges[0];
}
float getMaxValue() {
return hranges[1];
}
// 设置直方图箱子的数目,默认值为256
void setNBins(int nbins) {
histSize[0]= nbins;
}
int getNBins() {
return histSize[0];
}
// 下面就是计算一维直方图,通过调用cv::calcHist函数
cv::MatND getHistogram(const cv::Mat &image) {
cv::MatND hist;
cv::calcHist(&image,
1, // 仅为一个图像的直方图
channels, // 使用的通道
cv::Mat(), // 不适用掩码
hist, // 作为结果的直方图
1, // 一维直方图
histSize, // 箱子的数量
ranges // 像素值的范围
);
return hist;
}</span>
程序:
cv::Mat image= cv::imread("group.jpg",0);
if (!image.data)
return 0;
cv::namedWindow("Image");
cv::imshow("Image",image);
Histogram1D h;
cv::MatND histo= h.getHistogram(image);
cv::namedWindow("Histogram");
cv::imshow("Histogram",h.getHistogramImage(image));
cv::waitKey(0);
实验代码下载:http://download.csdn.net/detail/tjylv/9444425(包括计算图像直方图、图像均衡化、图像对比度拉伸)