【OpenCV】直方图以及灰度直方图C++的实现

8 篇文章 0 订阅

在分析图像、物体和视频信息的时候,我们经常用直方图来表达我们关注的信息。直方图在计算机视觉中应用广泛。例如,通过判断帧与帧之间边缘和颜色的统计量是否出现巨大变化,来检测视频中场景的变换。
直方图只是简单地将数据归入预定义的组,并在每个组内进行计数。也可以选择对数据提取特征、再对特征进行计数,这里的特征可以是梯度的长度、梯度的方向、颜色或者其他任何可以反映数据特点的特征,也就是说,直方图是一种用来揭示数据分布的统计特性的工具。直方图的维度通常比原始数据的维度低。
OpenCV中使用数组来表示直方图,这里的数组和用来表示其他数据额数组没有任何区别。这意味着对于一维或二维数组,你可以使用cv::Mat(NX1或者1XN来表示一维数组),也可以使用vector<>或稀疏矩阵类型。当我们把一个数组视为直方图时,它就具有和普通数组完全不同的含义。例如,若一个n维数组被视为直方图,数组中的每个元素表达的是该n维直方图中对应组中的计数结果。而直方图中组的编号就是数组某维与其该组对应的元素的下标,它们通常都是整数。
OpenCV中使用cv::calcHist()从数据创建直方图

什么是灰度直方图:
在数字图像处理中,灰度直方图是一种计算代价非常小但很有用的工具,它概括了一幅图像的灰度级信息。灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率。

c++代码如下:

Mat calcGrayHist(const Mat & image)
{
	Mat histogram = Mat::zeros(Size(256,1),CV_32SC1);    	 //256对应的是0~255共计256个像素值
													  		 //注意,Size对应的是x和y,也就是第一个元数是矩阵的列数
	int rows = image.rows;   	 //输入图像的行数
	int cols = image.cols;		 //输入图像的列数

	for(int r =0;r<rows;r++)
	{
		for(int c = 0;c<cols;c++)
		{
			int index = int(image.at<uchar>(r,c);	//获取每个点的像素值
			histogram.at<int>(0,index) +=1;			//获取了一个像素值,在相应的位置上加1
		}
	}
	return histogram;
}

图像对比度是通过灰度级范围来度量的,而灰度级范围可通过观察灰度直方图得到,灰度级范围越大代表对比度越高;反之,对比度越低,低对比度的图像在视觉上给人的感觉是看起来不够清晰。

  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值