如何使用抖动显示仅带有黑白像素的灰度图像?

时间:2016-12-28 18:52:06

标签: graphics 2d dithering

我有256级灰度图像,我只想拍摄#000(黑色)和#FFF(白色)像素(没有别的)。

一种方法是使用抖动:https://upload.wikimedia.org/wikipedia/commons/6/6d/Dithering_example_red_blue.png

在这样的算法中,通过增加区域中的像素数(白色和黑色)来实现一种模糊。

我不知道如何实现它:我如何确定代表所需灰度级别的像素数? 你能写一下这样的算法(例如使用伪代码,还是Java,Scala,C,C ++)?

1 个答案:

答案 0 :(得分:1)

有许多不同的算法可以创建抖动,我最喜欢的是随机的,它很容易实现,它没有重复的模式,如果你每帧都重新抖动你的图像,那么随着时间的推移它会平均化。

首先,一个重要且经常被忽略的部分是将256个灰度级从sRGB(伽马压缩)值转换为线性(伽马未压缩)值,否则如维基百科的Dither文章中的示例所示,您的抖动图像将太亮。要进行转换,请使用256条目查找表,并使线性值从0到4095。

然后只需使用linear_value < (rand()&4095) ? 0 : 255设置抖动,这可以通过将0到4095之间的随机值与线性值进行比较,从而为您提供黑色或白色像素。因此,如果你的linear_value是3072(非常浅灰色),那么4个中的3个你将获得一个白色像素,而值为41(深灰色),你将获得100次中的99次黑色。