图像直方图概述、计算与绘制

文章目录

  • 1.图像直方图概述
  • 2.直方图的计算与绘制
  • 2.1 计算直方图:calcHist() 函数
  • 2.2 寻找最值:minMaxLoc() 函数
  • 2.3 示例程序:绘制 H-S 直方图
  • 2.4 示例程序:计算并绘制图像一维直方图
  • 2.5 示例程序:绘制 RGB 三色直方图

1.图像直方图概述

  直方图广泛运用于很多计算机视觉运用当中,通过标记帧与帧之间显著的边缘和颜色的统计变化,来检测视频中场景的变化。在每个兴趣点设置一个有相近特征的直方图所构成 “标签”,用以确定图像中的兴趣点。边缘、色彩、角度等直方图构成了可以被传递给目标识别分类器的一个通用特征类型。色彩和边缘的直方图序列还可以用来识别网络视频是否被复制。
  其实,简单来说,直方图就是对数据进行统计的一种方法,并且将统计值组织到一系列实现定义好的 bin 当中。其中, bin 为直方图中经常用到的一个概念,可以译为 “直条” 或 “组距”,其数值是从数据中计算出的特征统计量,这些数据可以是诸如梯度、方向、色彩或任何其他特征。且无论如何,直方图获得的是数据分布的统计图。通常直方图的维数要低于原始数据。
  图像直方图(Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。这种直方图中,横坐标的左侧为纯黑、较暗的区域,而右侧为较亮、纯白的区域。因此一张较暗图片的直方图中的数据多集中于左侧和中间部分,而整体明亮、只有少量阴影的图像则相反。CV 领域常借助图像直方图来实现图像的二值化。
  直方图的意义如下:
  ● 直方图是图像中像素强度分布的图形表达方式。
  ● 它统计了每一个强度值所具有的像素个数。

  直方图是对数据的统计集合,并将统计结果分布于一系列预定义的 bins 中。这里的数据不仅仅指的是灰度值,且统计数据可能是任何有效描述图像的特征。
  假设有一个矩阵包含一张图像的信息(灰度值 0 – 255),既然已知数字的范围包含 256 个值,于是可以按一定规律将这个范围分割成子区域(也就是 bins)。如:
《图像直方图概述、计算与绘制》

  然后再统计每一个 bin(i) 的像素数目。采用这一方法来统计上面的数字矩阵,可以得到下图(其中 x 轴表示 bin,y 轴表示各个 bin 中的像素个数):

《图像直方图概述、计算与绘制》

直方图的一些术语和细节:
  ● dims:需要统计的特征数目。在上例中,dims = 1 ,因为仅仅统计了灰度值(灰度图像)。
  ● bins:每个特征空间子区段的数目,可译为 “直条” 或 “组距”,在上例中, bins = 16。
  ● range:每个特征空间的取值范围。在上例中,range = [0, 255]。

2.直方图的计算与绘制
  直方图的计算在 OpenCV 中可使用 calcHist() 函数,而计算完成之后,可以采用 OpenCV 中的绘图函数,如绘制矩形的 rectangle() 函数,绘制线段的 line() 来完成。2.1 计算直方图:calcHist() 函数
  calcHist() 函数用于计算一个或多个阵列的直方图。
 

void calcHist(
	const Mat* images,	//输入的数组或数据集
	int nimages,		//输入数组的个数
	const int* channels,	//需要统计的通道(dim)索引	
	InputArray mask,	//可选的操作掩码,用于标记出统计直方图的数组元素数据
	OutputArray hist,	//输出的目标直方图	
	int dims,			//需要计算的直方图的维数
	const int* histSize,	//存放每个直方图尺寸的数组
	const float** ranges,	//每一维数值的取值范围
	bool uniform = true,	//指示直方图是否均匀的标识符
	bool accumulate = false		//累计标识符,主要是允许多从多个阵列中计算单个直方图,
								//或者用于在特定的时间更新直方图。
)

  ● 第一个参数:const Mat* 类型的 iamges,输入的数组(或数据集),它们需为相同的深度(CV_8U 或 CV_32F)和相同的尺寸。
  ● 第二个参数:int 类型的 nimages,输入数组的个数,也就是第一个参数中存放了多少张 “图像”,有几个原数组。
  ● 第三个参数:const int* 类型的 channels,需要统计的通道(dim)索引。第一个数组通道从 0 到 images[0].channels() – 1,而第二个数组通道从 images[0].channels() 计算到 images[0].channels() + images[1].channels() – 1。
  ● 第四个参数:InputArray 类型的 mask,可选的操作掩码。如果此掩码不为空,那么它必须为 8 位,并且与 images[i] 有同样的大小和尺寸。这里的非零掩码元素用于标记出统计直方图的数组元素数据。
  ● 第五个参数:OutputArray 类型的 hist,输出的目标直方图,一个二维数组。
  ● 第六个参数:int 类型的 dims,需要计算的直方图的维数,必须是正数,且不大于 CV_MAX_DIMS(在 OpenCV3 中等于 32)。
  ● 第七个参数:const int* 类型的 histSize,存放每个维度的直方图尺寸的数组。
  ● 第八个参数:const float** 类型的 ranges,表示每一个维度数组(第六个参数 dims)的每一维的边界阵列,可以理解为每一维数值的取值范围。
  ● 第九个参数:bool 类型的 uniform,指示直方图是否均匀的标识符,有默认值 true。
  ● 第十个参数:bool 类型的 accumulate,累计标识符,有默认值 false。若其为 true,直方图在配置阶段不会被清零。此功能主要是允许多从多个阵列中计算单个直方图,或者用于在特定的时间更新直方图。

原文查看转载文章

https://blog.csdn.net/qq_38701868/article/details/89215881#1_2

    原文作者:无止境x
    原文地址: https://blog.csdn.net/xjp_xujiping/article/details/103335001
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞