【Opencv】用直方图统计图像

图像由像素构成,每个像素有不同的数值。在单通道灰度图像中,每个像素的数值在0(黑色)~255(白色)之间分布。直方图是一个简单的表格,表示一个图像中具有某个值的像素数量。以灰度图像为例,直方图是一幅横轴表示灰度值(0~255)的分布,纵轴表示图像中对应灰度值的像素的数目,也可以说,灰度直方图有256个箱子(bin),0号箱子提供值为0的像素的数量,1号箱子提供灰度值为1的像素的数量......以此类推。

计算图像直方图(以一幅灰度图像为例)

//创建灰度图像的直方图
class Histogram1D {
  private:

    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];
	}

	// 设置直方图的横轴范围,默认为[0,255]
	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;
	}
【Opencv】用直方图统计图像_第1张图片                            【Opencv】用直方图统计图像_第2张图片

程序:

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(包括计算图像直方图、图像均衡化、图像对比度拉伸)













你可能感兴趣的:(OpenCV)