打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
直方图均衡化
userphoto

2016.09.09

关注

原理

图像的直方图是什么?

  • 直方图是图像中像素强度分布的图形表达方式.
  • 它统计了每一个强度值所具有的像素个数.

什么是直方图?

  • 直方图是对数据的集合 统计 ,并将统计结果分布于一系列预定义的 bins 中。

  • 这里的 数据 不仅仅指的是灰度值 (如上一篇您所看到的), 统计数据可能是任何能有效描述图像的特征。

  • 先看一个例子吧。 假设有一个矩阵包含一张图像的信息 (灰度值

    ):

  • 如果我们按照某种方式去 统计 这些数字,会发生什么情况呢? 既然已知数字的 范围 包含 256 个值, 我们可以将这个范围分割成子区域(称作 bins), 如:

    然后再统计掉入每一个

    的像素数目。采用这一方法来统计上面的数字矩阵,我们可以得到下图( x轴表示 bin, y轴表示各个bin中的像素个数)。

  • 以上只是一个说明直方图如何工作以及它的用处的简单示例。直方图可以统计的不仅仅是颜色灰度, 它可以统计任何图像特征 (如 梯度, 方向等等)。

  • 让我们再来搞清楚直方图的一些具体细节:

    1. dims: 需要统计的特征的数目, 在上例中, dims = 1 因为我们仅仅统计了灰度值(灰度图像)。
    2. bins: 每个特征空间 子区段 的数目,在上例中, bins = 16
    3. range: 每个特征空间的取值范围,在上例中, range = [0,255]
  • 怎样去统计两个特征呢? 在这种情况下, 直方图就是3维的了,x轴和y轴分别代表一个特征, z轴是掉入

    组合中的样本数目。 同样的方法适用于更高维的情形 (当然会变得很复杂)。

直方图均衡化是什么?

  • 直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法.
  • 说得更清楚一些, 以上面的直方图为例, 你可以看到像素主要集中在中间的一些强度值上. 直方图均衡化要做的就是 拉伸 这个范围. 见下面左图: 绿圈圈出了 少有像素分布其上的 强度值. 对其应用均衡化后, 得到了中间图所示的直方图. 均衡化的图像见下面右图.

直方图均衡化是怎样做到的?

  • 均衡化指的是把一个分布 (给定的直方图) 映射 到另一个分布 (一个更宽更统一的强度值分布), 所以强度值分布会在整个范围内展开.

  • 要想实现均衡化的效果, 映射函数应该是一个 累积分布函数 (cdf) (更多细节, 参考*学习OpenCV*). 对于直方图

    , 它的 累积分布
    是:

    要使用其作为映射函数, 我们必须对最大值为255 (或者用图像的最大强度值) 的累积分布

    进行归一化. 同上例, 累积分布函数为:

  • 最后, 我们使用一个简单的映射过程来获得均衡化后像素的强度值:

结果

  1. 为了更好地观察直方图均衡化的效果, 我们使用一张对比度不强的图片作为源图像输入, 如下图:

    它的直方图为:

    注意到像素大多集中在直方图中间的强度上.

  2. 使用例程进行均衡化后, 我们得到下面的结果:

    这幅图片显然对比度更强. 再验证一下均衡化后图片的直方图:

    注意到现在像素在整个强度范围内均衡分布.


直方图均衡化

经典算法

下面以一幅3*2像素的简单图片(图C)为例,来说明灰度直方图均衡化的算法。

 (图C)

图C的直方图:

注意看百分位(Percentile)这一项。一般软件的百分位是 当前色阶的像素数量÷总像素数量,而Photoshop不同,Photoshop显示的是 当前色阶与前面色阶的所有像素数量÷总像素数量。因此图C色阶为100时的百分位就是(3+2)/6=5/6=83.33%,这个百分位其实就是我们要求的灰度值(范围0~1),把它转换成0~255的范围,要再乘255。

求出每个色阶的百分位之后,再乘255,就可以求出与其对应的灰度值来。

色阶 数量 出现频率 百分位 255*百分位

根据每个色阶的 色阶->255*百分位 的对应关系组成一个灰度映射表,然后根据映射表来修改原来图片每个像素的灰度值。对于图C,用128替换50,用212替换100,用255替换200。这样,灰度直方图的均衡化就完成了。

Photoshop的算法

经过经典算法均衡化的图片,最亮的像素值总是255,因为最后一级色阶(255)的百分位一定是100%。而最暗的是由色阶0的数量决定的,像素值不一定是0。

Photoshop通过对比度拉伸的方法使最暗的像素值变为0,其它像素也相应变暗,最亮的像素保持255不变。对比度拉伸后的效果可能会比经典算法稍显偏暗。

对比度拉伸的算法,类似于使用色阶调整命令把黑场设成Min时的效果,Min是指像素数量不为0的第一个色阶。

对比度拉伸的公式:C = (Level - Min) * Scale = (Level - Min) * 255 / (255-Min)

图C均衡化之后的灰度值分别是128、212、255,为了精确,我们使用保留2位小数的形式(127.50、212.42、255.00)来进行对比度拉伸的计算。

Min = 127.50 '均衡化之后的最小值
Scale = 255/(255-Min) = 2

(127.50-Min)*Scale = 0*2 = 0
(212.42-Min)*Scale = 84.92*2 = 170
(255.00-Min)*Scale = 127.5*2 = 255

'新的映射表:
50  -> 0
100 -> 170
200 -> 255

经典算法和Photoshop算法的直方图比较。


彩色算法

彩色的直方图均衡化其实就是对图像某个或多个颜色通道进行灰度直方图均衡化运算,常见的有以下几种方法:

  1. 统计所有RGB颜色通道的直方图的数据并做均衡化运算,然后根据均衡化所得的映射表分别替换R、G、B通道颜色值。
  2. 分别统计R、G、B颜色通道的直方图的数据并做均衡化运算,然后根据R、G、B的映射表分别替换R、G、B通道颜色值。
  3. 用亮度公式或求RGB的平均值的方式计算亮度通道,然后统计亮度通道的直方图的数据并做均衡化运算,然后根据映射表分别替换R、G、B通道颜色值。

Photoshop用的是第一种方法。


直方图均衡化原理

直方图均衡化的作用是图像增强。

有两个问题比较难懂,一是为什么要选用累积分布函数,二是为什么使用累积分布函数处理后像素值会均匀分布。

第一个问题。均衡化过程中,必须要保证两个条件:①像素无论怎么映射,一定要保证原来的大小关系不变,较亮的区域,依旧是较亮的,较暗依旧暗,只是对比度增大,绝对不能明暗颠倒;②如果是八位图像,那么像素映射函数的值域应在0和255之间的,不能越界。综合以上两个条件,累积分布函数是个好的选择,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题),所以直方图均衡化中使用的是累积分布函数。

第二个问题。累积分布函数具有一些好的性质,那么如何运用累积分布函数使得直方图均衡化?比较概率分布函数和累积分布函数,前者的二维图像是参差不齐的,后者是单调递增的。直方图均衡化过程中,映射方法是

其中,n是图像中像素的总和,

是当前灰度级的像素个数,L是图像中可能的灰度级总数。

来看看通过上述公式怎样实现的拉伸。假设有如下图像:


得图像的统计信息如下图所示,并根据统计信息完成灰度值映射:


映射后的图像如下所示:



本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
直方图均衡化(色调均化) I
FPGA数字图像处理实战——直方图均衡化变换(Verilog)
哪位能用通俗易懂的语言描述一下直方图均衡化和直方图匹配算法!回答者有分!
FPGA图像算法.直方图均衡化(去雾)
图像处理的基本算法
图像去雾技术综述
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服