图像处理系列——直方图之灰度直方图(Image Histogram)
Posted nanke_yh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像处理系列——直方图之灰度直方图(Image Histogram)相关的知识,希望对你有一定的参考价值。
目录
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从零到壹] 五十一.图像增强及运算篇之图像灰度直方图对比分析万字详解