图像处理系列——直方图之灰度直方图(Image Histogram)

Posted nanke_yh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像处理系列——直方图之灰度直方图(Image Histogram)相关的知识,希望对你有一定的参考价值。

目录

0、前言

1、理论知识

2、数学原理

3、案例分析

4、代码实现

5、结果显示


0、前言

        直方图是对数据的统计集合,并将统计结果分布于一系列预定义的bins中。其中,bin为直方图中经常用到的一个概念,可以译为“直条”或“组距”;其数值是从数据中计算出的特征统计量,这些数据不仅仅指的是灰度值,可能是任何有效描述图像的特征(诸如梯度、方向、色彩或任何其他特征)。直方图获得的是数据分布的统计图,通常直方图的维数要低于原始数据。

        直方图的一些术语和细节:

● dims:需要统计的特征数目。在灰度图像中,dims = 1,因为仅仅统计了灰度值。

● bins:每个特征空间子区段的数目,可译为“直条”或“组距”,在灰度直方图中,bins = 256,每个灰度级分为一个bins。

● range:每个特征空间的取值范围。在8bit灰度图像中,range = [0, 255]。

图像直方图(Image Histogram)

1、理论知识

        图像直方图(也叫灰度直方图)反映了图像像素分布的统计特性,是图像处理中简单有效的工具。图像直方图广泛地应用于图像处理的各个领域,如:特征提取、图像匹配、灰度图像的阈值分割、基于颜色的图像检索以及图像分类。

        图像直方图的形态很大程度上可直观的反映图像的质量情况,比如根据下图所示,会很快的发现一张图片是否过亮还是过暗。

         图像直方图优点是:计算代价较小,且具有图像平移旋转缩放不变性等。

2、数学原理

图像灰度直方图计算:

        其中,W,H分别表示图像的宽(列)和高(行),表示图像中像素值为r的数量,P(r)表示图像中像素值为r的频率,L是指图像灰度级数(比如:8Bit的灰度图像L=2^8,其存在256个色阶(灰度级),即0~255)。

3、案例分析

假设有一副图像,共64×64个像素,8个灰度级,各个灰度级对应像素数量见下表,获取其直方图。

灰度级 r

0

1

2

3

4

5

6

7

像素数量nr

792

1026

851

662

323

240

120

82

概率分布P(r)

0.19 

0.25

0.21

0.16

0.08

0.06

0.03

0.02

(1)确定图像的灰度级

        要处理的图像是灰度图像,如果是彩色的,需要先转化成灰度图像,然后确定图像的灰度级有多大,一般就是8位的图像,灰度级为0-255,示例中的是3位的,灰度级为0-7。

(2)统计各灰度级像素数目

        统计每一个灰度级在整个图像中像素的个数,总和为W*H,示例中总和为64*64=4096。记第r个灰度的数量为。 

(3)计算原始直方图概率分布P(r)

        统计每一个灰度在整个图像中像素个数的占比,总和为1。记第r个灰度的直方图分布概率为P(r)。

4、代码实现

        Width、Height为HistogramFun类中的public成员,读取影像时给它赋值了。分别为影像的宽、高。

/*function description:计算图像直方图
*input parameter:ImgTyp* Image    图像指针                
*return:  double* ImgHist  直方图(各灰度级像素统计概率)
******************************************************/
double* HistogramFun::CalImgHist(ImgTyp* Image)

	if (Image == NULL)
	
		return NULL;
	
	double* ImgHist = new double[ColorLen];
	memset(ImgHist,0,sizeof(double)*ColorLen);//涉及值的传递问题,必须创建内存存储
	for (int i = 0; i < Height; i++)
	
		for (int j = 0; j < Width; j++)
		
			ImgHist[Image[i*Width+j]]++;//统计各个灰度级的数量
		
	
	for (int i = 0; i < ColorLen; i++)
	
		ImgHist[i] = ImgHist[i] / (Width*Height);//归一化求各个灰度级出现频率
	
	return ImgHist;

5、结果显示

        这里opencv库的调用仅仅作为显示功能使用,其实opencv库内也有着非常丰富的图像处理方面的封装函数可供使用。基于上面得出的结果进行显示:

原图

showImg(filepath,"原图");

原图直方图

double* histArr = hist.CalImgHist(img);

showHist(histArr,"原图直方图");

以上是关于图像处理系列——直方图之灰度直方图(Image Histogram)的主要内容,如果未能解决你的问题,请参考以下文章

[Python从零到壹] 五十一.图像增强及运算篇之图像灰度直方图对比分析万字详解

[Python从零到壹] 五十一.图像增强及运算篇之图像灰度直方图对比分析万字详解

OpenCV之直方图处理

灰度图像的直方图

图像增强之---直方图均衡化

计算绘制图像灰度直方图