灰度变换及dithering抖动算法

  • Post author:
  • Post category:其他


1.灰度变化:

色深是一个可以显示灰阶个数的参数。对于8bit的显示器来说,灰阶数就是256个;对于10bit的显示器来说,灰阶数就是1024个,所以位数越高的显示器,灰阶范围也就越大,图像的明暗变化也就越平滑。

如下图1所示,是一个变化不平滑的灰阶,它对于图像的明暗显示局限性非常的大;

图1

图2是8bit的灰阶范围图,但是由于8bit无法将全部的灰阶显示出来,所以灰阶图上会出现一条一条的条带,这种现象称为“色带”。

图2

图3是16bit的灰阶范围图,可以看到16bit的灰阶范围更为广阔,明暗变化也更为平滑。

2.抖动算法

对于8bit的显示器,加入我们给它足够的补偿,那么8bit的显示器对于灰阶的显示也会更加的平滑。抖动算法( dithering)就是实现这一目的的重要方法,也可以知道,抖动算法就是高精度信号转换到低精度信号时,对损失部分信号的填补与增益。

为什么高精度信号转换为低精度信号时会失真?

试想,高精度信号是一个保留1位小数的等差数列:1.0,1.6,2.2,2.8,3.4……

而低精度信号只能保留每项为整数,这时候这个等差数列会变成什么样?

四舍五入:1,2,2,3,3

向下取整:1,1,2,2,3

向上取整:1,2,3,3,4

常规方法下生成的新数列没有一个能还原出原数列等差排列的效果:新信号不仅丢失了精度,更重要的是变化的幅度不再均匀——这才是最要命的,而这其实就是图像信号中色带(banding)的产生原因。

而抖动算法正为此而生,抖动算法通过在原信号之间增加噪音,使得新信号呈现出和原信号更多的一致性。

下面是一个抖动算法效果的演示:



上图中,左图为原图,原生具有8bit的高位深。当其以低位深输出时,中间的图是不加抖动的结果,而右图使用了一种error diffusion dithering的算法,于是结果迥异。右图虽然增加了噪点,但完全避免了色带的产生。

这个演示告诉了你,在选择显示器时,原生10 bit面板固然最好,但即使8 bit面板仍然能很好地表现10 bit内容。上图是8 bit内容抖动到有效精度不到3bit情况下的结果,可想而知,10 bit内容抖动到8 bit的效果会更好得多,而且基本上不会增加太多可闻的噪点。