dithering

图像平滑算法: Dithering

稚晖君的视频用墨水屏显示图像的部分提到了这个算法,感觉很有意思。墨水屏或者黑白打印机只能显示二值的黑白像素,dithering算法能帮我们用黑白近似灰度图像。其实,更一般地,dithering算法可以用来平滑各种信号量化带来的误差。

原理

考虑将灰度图像(0为全黑,255为全白)量化为黑白图片,灰度值为42时我们如何量化呢?简单的做法是取灰度上的近邻,用0来表示灰度值为42的像素。对于量化产生的误差,如果直接忽略,最后生成的图像质量会很差,因此我们需要找到更好的处理量化误差的方式。

error diffusion

error diffusion dithering算法以某种顺序处理像素,处理像素时的量化误差在迭代处理像素时扩散(diffusion)。例如:当前像素为42,量化为0的误差为42,假设下一个像素值为100,那么加上传递过来的误差等于142,此像素应该量化为1,此时误差变为142 - 255 = -113,继续向下一个像素传递,以此类推。

缺点:原图中的色块会扩散为黑色的线。

上面线性的处理的一个意想(liao)不(zhi)到(zhong)的后果(artifacts)就是会导致生成图像中奇怪的条纹。核心的原因就是2D图像采用了1D的误差扩散方式。

2D error-diffusion: Floyd-Steinberg Dithering

从左上角向右下角扩散,局部涉及的像素和系数表如下:

X 7/16
3/16 5/16 1/16

2D error-diffusion: Jarvis, Judice, and Ninke Dithering

同样是左上角向右下角扩散,设计的像素和系数表如下:

X 7/48 5/48
3/48 5/48 7/48 5/48 3/48
1/48 3/48 5/48 3/48 1/48

很多其他的扩散方式可以选择,but you get the idea.

/!-- -->