直方图均衡原理和实践

直方图均衡

    • 背景
    • 直方图均衡化
    • 直方图匹配(规定化)
    • 效果展示

背景

直方图均衡本质上是一个灰度线性变换(当然也可以用在RGB通道),这个线性变换有个好处是说变换后的图像他在每个灰度级上的分布是均匀的。举个例子,假如一副很暗的图像,它的灰度分布肯定都挤在灰度很低的一端,而很亮的图像灰度分布都在很亮的一端。另外也有可能图像不是很亮也不是很暗,但是它的像素分布就是集中在中间的某一个小区间,这样表现出来就好像色彩被冲淡了一样。通过直方图均衡,重新对他的亮度进行一个调整,使得亮度的分布是变得均匀的,这样调整后的图像的像素倾向于占据整个可能的灰度级,表现出来就是图像有很高的对比度,并且明暗细节都很丰富。

直方图均衡化

我们首先需要定义的是灰度分布如何衡量,其实很简单,假如是离散型的数字图像,我们只需要统计一下它在每个灰度级上出现的概率即可。比如一般图像的灰度级取值是0 ~ 255,我们就分别统计0 ~ 255这里面每一个值对应的像素点的个数,然后除以总的个数,即可得到每个灰度值对应的概率,我们把这个概率统计称之为这幅图像的直方图信息。
然后我们定义灰度线性变换函数,灰度线性变换通过公式来表示就是 s = T ( r ) s = T(r) s=T(r), 这里面T就是这个变换函数,r是变换前的灰度值,s是变换后的灰度值。我们还希望这个T具有一些特别的性质:

  1. T在r的可取值区间上是单调递增的, 这样和原图像保持一致,原图像比较亮的地方还是比较亮。特别的,我们还希望T是一个一一映射的关系,这样我们保证映射后的图像还能通过逆操作反映射回来
  2. 0 < = r < = L − 1 时 , 0 < = T ( r ) < = L − 1 0<=r<=L-1时,0<=T(r)<=L-1 0<=r<=L10<=T(r)<=L1。这个很好理解,就是变换后的值还是原图所能表达的灰度值,不要出现溢出

回到直方图均衡,我们的目标是通过图像的直方图信息开发出一个线性变换函数,他使得变换后的图像的直方图是分布均匀的。我们分这么几步来做这个事情:

  1. 设原图像的概率密度函数为 p r ( r ) p_r(r) pr(r),变换后的概率密度函数位 p s ( s ) p_s(s) ps(s),实际上 p r ( r ) p_r(r) pr(r) p s ( s ) p_s(s) ps(s)的关系可以表示为 p s ( s ) = p r ( r ) ∗ ∣ d r d s ∣ p_s(s) = p_r(r) * \left|\frac{dr}{ds}\right| ps(s)=pr(r)dsdr
  2. 在图像处理中,我们有个非常重要的变化函数是 s = T ( r ) = ( L − 1 ) ∫ 0 r p r ( w ) d w s=T(r)=(L-1)\int_0^rp_r(w)dw s=T(r)=(L1)0rpr(w)dw,也就是随机变量r的累计积分函数,它的取值是0到1,然后乘上一个L-1,所以取值变为0到L-1。同时由于这个累计积分函数实际上就是表示的在概率函数下方的面积,由于概率函数值总为正,所以累计积分函数肯定是一个递增的函数。满足我们对于变换函数要求的条件。
  3. 对于2中的s,它的导数就是概率密度函数,也就是 d s d r = ( L − 1 ) p r ( r ) \frac{ds}{dr}=(L-1)p_r(r) drds=(L1)pr(r)。将它代入到1,即可得到 p s ( s ) = p r ( r ) ∗ ∣ 1 ( L − 1 ) p r ( r ) ∣ = 1 L − 1 p_s(s) = p_r(r)*\left|\frac{1}{(L-1)p_r(r)}\right|=\frac{1}{L-1} ps(s)=pr(r)(L1)pr(r)1=L11, 它是一个均匀分布,在每一个点的分布上概率是相同的

也就是我们通过上面的推导得到一个线性变换函数 s = T ( r ) = ( L − 1 ) ∫ 0 r p r ( w ) d w s=T(r)=(L-1)\int_0^rp_r(w)dw s=T(r)=(L1)0rpr(w)dw,只要经过它的变换后,得到的图像的灰度值在可取值的范围类是均匀分布的。可以看到这个变换的要求是非常简单的,它只需要输入一副图片,就可以自动的计算出直方图,从而得到直方图变换函数,然后对每个像素点进行一一的映射匹配即可完成。

直方图匹配(规定化)

虽然直方图均衡能自动的确定变换函数,然后通过该函数产生出具有均匀直方图的图像。但是在某些场景下,我们希望处理后的图像具有规定的直方图形状,这种方法称之为直方图匹配或者直方图规定化。
首先我们来直观理解一下这个问题,我们有个图像的直方图为A,然后我们想变换到具有直方图为B的图像,同时我们又知道这幅图新的直方图均衡化后的直方图为S,那么A->S的变换我们知道怎么做了,B->S的变换也知道怎么做了,求A->B的变换,就是A->S,然后在S->B(可以通过B->S的逆变换来或得)。
公式化推导一下,我们假定原图的概率密度函数为 p r ( r ) p_r(r) pr(r), 要变换后的概率密度函数为 p z ( z ) p_z(z) pz(z),那么
s = T ( r ) = ( L − 1 ) ∫ 0 r p r ( w ) d w s=T(r)=(L-1)\int_0^rp_r(w)dw s=T(r)=(L1)0rpr(w)dw,
G ( z ) = ( L − 1 ) ∫ 0 z p z ( t ) d t = s G(z) = (L-1)\int_0^zp_z(t)dt=s G(z)=(L1)0zpz(t)dt=s,
由此可得
z = G − 1 [ T ( r ) ] = G − 1 ( s ) z = G^{-1}[T(r)] = G^{-1}(s) z=G1[T(r)]=G1(s),
其中z为我们要求的值,也就是我们得到原图的灰度值r到变换后图像的灰度值z的一个映射。
对于离散型的数字图像,我们可以分这么几步来做这个事情,通过一个table的方式简化这个寻找逆函数的过程:

  1. 计算给定图像的直方图 p r ( r ) p_r(r) pr(r),并利用它寻找直方图均衡变换 s k s_k sk,把 s k s_k sk四舍五入为整数
  2. 对于给定的直方图 p z ( z ) p_z(z) pz(z),我们计算出 G ( z ) G(z) G(z),并利用0~L-1分别代入计算所有的 G ( z ) G(z) G(z)的值,将它存在一个表中
  3. 对于每一个 s k s_k sk的值0 ~ L-1,我们通过2中的表来找到最接近的 G ( z ) G(z) G(z)的值,并找到它对应的z的值。
  4. 首先对图像进行直方图均衡,然后通过3找到的映射将其映射为最终我们要找的z值。

效果展示

你可能感兴趣的:(图像处理)