心血来潮,想写一写直方图均衡化。我先说说为什么要写直方图均衡化,因为之前接触到理论上的面试,看起来很简单的知识点,其实暗藏着很多的玄机(-_-)。本文尽量尝试着去推导。推导之前写一下基本的原理。
关注公众号,获取更多信息
1、为什么要做直方图均衡化与直方图规定化
在现实的拍摄过程中,比如说视频监控领域,由于其图像的灰度分布集中在较窄的范围内,这就导致了图像的细节不够清晰。为什么不清晰呢,因为灰度分布较窄时,那么,在计算对比度的时候,对比度就很小,所以就不清晰。为了使得图像变得清晰,那么就需要使得灰度值的差别变大,为了使得灰度值的差别变大,就意味着灰度分布就变的较宽,使得灰度值分布变得均匀,在某个灰度级区间内,像素的个数分布大致相同,这样才能使得图像的对比度增强,细节变得清晰可见。
2、直方图均衡化的原理
直方图均衡化就是对图像进行非线性拉伸,使得变换后的图像直方图分布均匀。那么怎样才能使得新图像的直方图分布均匀呢?
在介绍直方图均衡化的原理之前,先介绍随机变量的函数分布的数学知识。
2.1、随机变量的函数分布
2.2.1、连续随机变量的函数分布
2.2.2、离散随机变量的函数分布
2.2 直方图均衡化的推导
直方图均衡化的目的是使得变换后的图像的直方图是均匀分布的,又因为概率密度是指变量落在某个区间的概率,而累积分布函数的导数就是概率密度函数。所以,当分布均匀时,就是使得概率密度能够保持为一个常数。有了这些分析,我们的目的就是想找到这样的一种变换函数,使得变换后图像直方图分布均匀(这里的直方图都用灰度级的个数除以总像素个数,进行归一化。)
假设r和s分别是变换之前和变换之后的图像灰度级,r和s都进行了归一化的处理。假设变换函数为
s=T(r),此变换公式满足0≤r≤1,0≤s≤1;当0≤r≤1时,T(r)是单调递增的。
则,假设r的概率密度为P(r),则s的概率密度可以表示为(根据上面我们介绍的概率密度函数的求解方法):
(1)
假设从r到s的变换函数为
(2)
式中,明显是r的累积分布函数(也就是)
公式(2)两边对r求导得到
带入到公式(1)中,得到
哇,太神奇了,当我们用r的累积分布函数作为变换函数时,得到s的概率密度函数是1(也就是均匀的意思)。
好了,这里就用连续函数的方式证明了采用原始图像直方图的累积分布来实现直方图均衡化是可行的。
由于我们的图像是离散的,所以,这样怎么求变换后的图像呢,只是把连续的函数离散化就行了。
(1)先求原始图像的直方图,就是每个灰度级的像素个数除以总像素个数,就是概率密度,
(2)原始图像灰度级概率密度的累积就是新图像灰度级的概率密度
,
k是新图像的灰度级,最大是255,也可以任意设置。
(3)由于上面求得的s是0到1之间的,然后乘以255或者设置的最大灰度级,就得到新图像的灰度值。
好了,这里就基本上说明了为什么要采用累积分布做直方图均衡化,以及如何做直方图均衡化。
3、直方图规定化
前面介绍了直方图均衡化,但是这是一种通用的对比度提升方法,如果我们想把图像变换到制定的直方图就显得力不从心。所以就有了直方图规定化,就是对原始图像做变换,使得变换后的图像的直方图跟我们规定的一样。
假设原始图像的像素值为r,概率密度为P(r);做直方图均衡化之后的灰度值为s,均衡化之后的概率密度为P(s);希望要的图像的概率密度为P(z),再次情况下,求得其像素值z。
实际上,规定化也是均衡化的一种,那么,就可以把均衡化的结果作为一种中间结果,建立起原始图像与固定化图像的一种桥梁。
具体步骤如下:
(1)首先对原始图像做直方图均衡化,得到每个像素s和累积分布T(s);
(2)根据需要的规定化直方图,求累积分布G(Z);
(3)显然,如果累积直方图中有0值,那么是不会分配像素值的,因为0乘以255还是零。
(4)对于每一个T(s)(假设其像素值为ss),找到在G(Z)中与其差值最小的那个G(z)值(假设对应的像素值为zz),那么规定化后就把ss变换为zz。
下面用两个典型的例子来说明,(数据来源于互联网,如有侵权,请告知)