【Opencv】用直方图统计图像

图像由像素构成,每个像素有不同的数值。在单通道灰度图像中,每个像素的数值在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(包括计算图像直方图、图像均衡化、图像对比度拉伸)













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值