【问题标题】:How to use dithering to display an gray image with only black and white pixels?如何使用抖动显示只有黑白像素的灰色图像?
【发布时间】:2016-12-28 18:52:06
【问题描述】:

我有一个 256 灰度级的图像,由于只有 #000(黑色)和 #FFF(白色)像素(仅此而已),我想绘制它。

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

在这样的算法中,通过增加一个区域中的像素数量(对我来说是白色和黑色)来产生一种模糊。

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

【问题讨论】:

标签: graphics 2d dithering


【解决方案1】:

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

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

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

【讨论】:

  • 恭喜您认识到从伽马校正水平转换的重要性,多年来我一直不知道这个问题。虽然随机抖动非常简单,但它可能很慢(因为随机数生成很慢)并且会产生丑陋的结果。我更喜欢 Floyd-Steinberg 本人,或者它的众多变体之一。纯随机噪声和高频噪声的区别见math.stackexchange.com/questions/2136099/…
  • 马克你不记得了吗?大约 4 年前,您看到了我的快速操作技巧:D stackoverflow.com/questions/15793747/…
猜你喜欢
  • 1970-01-01
  • 2014-04-21
  • 2021-01-08
  • 1970-01-01
  • 2021-06-27
  • 2020-02-12
  • 2018-09-28
  • 2015-05-05
相关资源
最近更新 更多