OpenCV_用直方图统计像素

*计算图像直方图

直方图是一个简单的表格,表示一个图像中具有某个值的像素的数量。因此灰度图像有256个项目,也叫箱子。0号箱子提供值为0的像素的数量,1号箱子提供值为1的像素的数量,等等。

效果:



代码:

#include <iostream>  
#include "opencv.hpp"  
#include "opencv2/core/core.hpp"  
#include "opencv2/highgui/highgui.hpp"       

//计算图像直方图
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] = 256.0;
		ranges[0] = hranges;
		channels[0] = 0;
	}
	cv::Mat getHistogram(const cv::Mat& image)
	{
		cv::Mat hist;
		cv::calcHist(&image,
			1,//仅为一个图像的直方图
			channels,//使用的通道
			cv::Mat(),//不使用掩码
			hist,//作为结果的直方图
			1,//这时一维的直方图
			histSize,//箱子数量
			ranges//像素值的范围
		);
		return hist;
	}
};

int main()
{
	cv::Mat image = cv::imread("puppy.jpg");
	cv::imshow("图片1", image);
	Histogram1D ch;
	cv::Mat histo = ch.getHistogram(image);
	for (int i = 0; i < 256; i++)
	{
		std::cout << "Value " << i << " = " << histo.at<float>(i) << std::endl;
	}
	cv::waitKey();
}


用直方图很难得到任何直观的意义,比较实用的做法是以函数的方式显示直方图,例如使用柱状图

效果:

代码:

#include <iostream>  
#include "opencv.hpp"  
#include "opencv2/core/core.hpp"  
#include "opencv2/highgui/highgui.hpp"       

//计算图像直方图
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] = 256.0;
		ranges[0] = hranges;
		channels[0] = 0;
	}
	cv::Mat getHistogram(const cv::Mat& image)
	{
		cv::Mat hist;
		cv::calcHist(&image,
			1,//仅为一个图像的直方图
			channels,//使用的通道
			cv::Mat(),//不使用掩码
			hist,//作为结果的直方图
			1,//这时一维的直方图
			histSize,//箱子数量
			ranges//像素值的范围
		);
		return hist;
	}
	cv::Mat getHistogramImage(const cv::Mat& image, int zoom = 1)
	{
		cv::Mat hist = getHistogram(image);
		return getImageofHistogram(hist, zoom);

	}
	static cv::Mat getImageofHistogram(const cv::Mat &hist, int zoom)
	{
		double maxVal = 0;
		double minVal = 0;
		cv::minMaxLoc(hist, &minVal, &maxVal, 0, 0);

		int histSize = hist.r
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值