温馨提示:本系列教程经过隔壁小学生认证!力争0基础也能看懂,也能入门
    对于一张灰度图(即常见的只有一个通道,像素值介于0~255的黑白图),可以通过遍历每个像素的像素值,统计其中像素值等于0,等于1,等于2,等于3···一直到等于255的像素个数,然后把像素值作为横坐标,像素个数作为纵坐标,就可以绘制一张像素值分布图,该图即为对应灰度图的直方图。如下图所示

直方图均衡化的灰度映射公式及解释 灰度直方图均衡化例题_直方图


直方图均衡化的灰度映射公式及解释 灰度直方图均衡化例题_直方图均衡化_02

    8位的灰度图像的直方图横坐标只有256个值,即0到255。显然如果一张灰度图是全白的,那么它的直方图中,横坐标等于255的个数就非常大,如果一张图是全黑,那么等于0的个数就非常大。
直方图可以非常直观的反应灰度图像的像素分布,如果一张图整体偏暗,或者整体偏白,那么它的直方图也会偏向一边,如下两张图所示,

直方图均衡化的灰度映射公式及解释 灰度直方图均衡化例题_直方图均衡化_03


直方图均衡化的灰度映射公式及解释 灰度直方图均衡化例题_直方图均衡化_04

直方图均衡化的灰度映射公式及解释 灰度直方图均衡化例题_直方图均衡化_05

直方图均衡化的灰度映射公式及解释 灰度直方图均衡化例题_直方图均衡化的灰度映射公式及解释_06

    很多时候相机拍出的底片就是整体偏白,或者整体偏暗,这时就需要对图像进行调整,直方图均衡化就是其中调整的算法之一,通过直方图均衡化,把示例图2和示例图3的直方图调整的跟示例图1所示的一样,让0到255的像素值都有个数,那么图像的整体画面就自然清晰,并且明暗错落有致。
    如何进行直方图均衡化?这里就涉及到计算图像的累计直方图。如果把示例图3的直方图中的个数从0到255一点点累加,比如从0到255访问每一个像素值,当访问到0时,纵坐标记录像素值等于0的个数,当访问到像素值1时,纵坐标就记录像素值等于0和像素值等于1的个数之和,当访问到像素值2时,纵坐标就记录像素值依次等于0,1,2的个数之和···依次类推,一直到像素值等于255时,纵坐标记录所有的像素个数,这个时候我们就得到示例3对应的累计直方图,如下图所示:

直方图均衡化的灰度映射公式及解释 灰度直方图均衡化例题_计算机视觉_07


    当把累计直方图中的纵坐标都除以像素个数时,我们就得到了图像的累计概率分布图:

直方图均衡化的灰度映射公式及解释 灰度直方图均衡化例题_直方图均衡化的灰度映射公式及解释_08


    注意看累计直方图纵坐标最大值是40000,说明有40000个像素,而累计概率分布图最大值为1。

    当得到累计概率分布图时,可以发现其分布也是不均衡的,看那个横坐标,从像素值0开始一直到像素值等于150多的时候,纵坐标才有概率值,如果想把图像调整均衡,肯定希望像素值等于0的时候就有概率值。这时,我们可能就想到要是把150多的像素值映射成0,也就是把像素值等于150多的概率(或者个数)直接给到像素值等于0那里该多好呀!没错,如果有个映射函数,让像素值进行映射,比如把上图的从150开始到255的概率分布,直接映射成0到255,那么就大功告成了。

    怎么得到这个映射函数呢?这时我们只需将累计概率分布图的纵坐标全部乘以255即可得到如下图的映射图:

直方图均衡化的灰度映射公式及解释 灰度直方图均衡化例题_计算机视觉_09


    上图中横坐标就是原图像素值,纵坐标就是结果图的像素值。横坐标范围是0到255,纵坐标的范围也是0到255,每一个横坐标的值都有一个纵坐标的值,它们是一一对应的。这样我们在遍历原图的时候,只需要按照上面的映射关系,把原图的像素值换成结果图的像素值就可以了。比如当访问一个像素是200时,只需要按照上图查看,横坐标是200,对应纵坐标的值是多少,就转换成这个值,就得到了直方图均衡化后的图了。

    直方图均衡化对于背景和前景都太亮或者太暗的图像非常有用。并且直方图均衡化是一个可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图。

    直方图均衡化的缺点是它对处理的数据不加选择,它可能会增加背景噪声的对比度并且降低有用信号的对比度。

    上面是有关直方图均衡化算法流程的讲解。关于为什么要先计算累计直方图,然后得到累计概率分布图,再通过累计概率分布图得到映射曲线,这里面涉及到的原理在《数字图像处理(冈萨雷斯版)》这本书中有详细的推导,如下图所示:

直方图均衡化的灰度映射公式及解释 灰度直方图均衡化例题_直方图均衡化_10

那里面的推导很严谨,涉及到概率论和微积分,对于刚入门图像算法的人来说不太好理解。我们平时做图像算法只需要知道处理流程及应用场景即可。