不能画灰色像素,不代表不能画出看起来像灰色的区域。
平滑渐变需要许多中间值,严格的黑白输出却只能提供两种。如果每个像素独立取整,结果会很直接:一边变黑,另一边变白。抖动处理换了一种取舍。它放弃单个像素上的平滑,让成组像素保留更多原始色调。小点并不是偶然覆盖在图片上的纹理,它们的排列本身就在承担一部分表达工作。
单个像素的限制,可以变成许多像素共同组成的图案。
一个阈值,把中间层次扔掉了
源图是一张合成渐变,宽 256、高 128 像素,数值从零变化到一,每一行相同。最简单的转换以二分之一为阈值:更低的值变成零,更高的值变成一。输出保留了两端,却把它们之间的大部分渐变压成了一条边界。
确实需要硬性二选一时,这个操作很有用;想保留平滑色调时,它就不理想。问题不是计算机没找到更聪明的灰色,而是规则已经禁止输出中间值。想改善结果,只能从剩下两个值的空间排列入手。
让相邻像素使用不同的阈值
有序抖动用一小块阈值矩阵替代单一阈值。本例把四乘四的 Bayer 矩阵重复铺在渐变上。源值越高,每个重复小块里变白的位置越多。输出仍然只有零与一,但附近像素可以通过两者所占比例,共同表示中间层次。
这种方法可预测、容易复现,也会留下可辨认的周期纹理。如果本来就想要受限的视觉风格,它可能很好看;如果与图像自身的细密纹理冲突,也可能很碍眼。矩阵并不识别物体或理解边缘,只是在落下的每个位置执行同一套重复规则。
4×4小块还有一个不用软件就能数的例子:十六个阈值位于相邻十六分之一刻度的中间。恒定0.25输入让四格白,0.5让八格白,0.75让十二格白。比例对完整对齐的小块精确成立;若裁切跨越边缘、统计块错位,或源值在块内变化,局部均值就可能不同。数完整小块能解释机制,却不能承诺每个位置都精确保持色调。
当前的取整误差,可以留给邻居参考
误差扩散选择另一条路。为像素选定零或一之后,先计算当前工作值与输出值的差,再按 Floyd–Steinberg 规则,把误差分给还没有处理的邻居:十六分之七交给右侧,其余按比例交给下一行的三个像素。后面的决定因此可以补偿前面的取整。
本实现每一行都从左向右扫描,超出图像边界的误差会被丢弃,没有逐行交替方向。这些选择会影响结果,因为顺序处理可能产生方向性纹理。误差扩散避开了同一个小块反复铺排,却不意味着它没有可见图案或边界效应。

看一小片区域的平均值
逐个像素直接比较输出与源值,会惩罚恰好让抖动发挥作用的那些小点。因此,本例把图片分成八乘八的块,比较各块平均值与对应源图平均值,再把所有块的绝对差求平均。测量的是一种特定的局部色调保留方式。
实测误差约为:硬阈值 0.2490,有序抖动 0.01556,误差扩散 0.00986。在这张渐变图上,两种抖动都更好地保留了块平均值。但这不表示误差扩散在所有照片、所有观看距离下都更好看。局部数值平均并不是完整的视觉模型。

同一批点,近看与远看可以很不同
贴近看,结果是一连串明确的黑白选择;离远些看,细密图案可能融合出中间色调的感觉。显示设备、印刷过程、观看距离和周围内容都会影响这种感觉。缩放已经抖动处理过的图,也可能引入新伪影,因为重采样会与原本按特定像素间距设计的图案相互作用。
实验使用标量数值,不是经过校准的亮度模型。数值二分之一不能直接称作屏幕感知亮度的一半。伽马编码、显示响应和印刷行为都需要另行讨论。封面为了网站配色重新着色,正文比较图保留了实际黑白输出。
分数可能奖励不合你目的的画面
只改变测量尺度,排名就反转。原渐变上,逐像素平均绝对误差分别为阈值0.24902、有序抖动0.33235、误差扩散0.33120。阈值赢,是因为每个像素独立挑了较近的可用端点;但按8×8邻域均值衡量,同一输出又明显落后。算术没有矛盾,两种评分奖励的是不同性质:一个针对单个决定,另一个针对一块区域。
完美的全局均值,也可能藏着糟糕的明暗图。扩展实验比较64×64、全为0.5的场、有序抖动,以及故意粗糙的左半黑右半白图。三者均值恰好都是0.5,但相对均匀参考图,按对齐8×8块计算,有序图误差为零,分半图却为0.5。保留白色总量,不等于保留明暗应在的位置。新图让失败直接可见,不必只信一个汇总数字。

同一个限制,可以有不同的花法
有序抖动提供稳定的重复结构,误差扩散利用前面决定留下的信息,往往形成不那么规则的纹理,而硬阈值保留鲜明的二值边界。不同目的可能适合不同方法,视觉上更讨喜的结果,也不一定是在某个数值评分上获胜的结果。
本地检查确认图片尺寸一致、输出严格为二值,以及在这张源渐变上,两种抖动的块平均误差都更小。它们没有建立通用排名。实验展示的是一种实用设计思路:当单个元素的能力有限,元素之间的关系仍能承载任何一个元素单独都无法表示的信息。
