多次运行Floyd Steinberg抖动算法图像无变化的合理性及原理问询
Floyd-Steinberg抖动算法多次运行输出无变化问题解答
结论
这一现象属于Floyd-Steinberg抖动算法的正常表现,不存在代码实现错误。
算法核心逻辑
Floyd-Steinberg属于误差扩散类抖动算法,核心处理流程为:
- 逐像素读取原始图像的灰度值,将其量化为目标色域的离散取值(例如二值抖动下仅为0/255纯黑、纯白),作为该位置的输出像素值
- 计算原始值与量化值的差值(即量化误差),按照7/16、3/16、5/16、1/16的权重,扩散到当前像素右侧、左下方、正下方、右下方四个还未被处理的相邻像素中
背后的数学原理
Floyd-Steinberg抖动算法的量化环节天生具有幂等性,即满足数学定义 f(f(x)) = f(x):同一操作执行多次的结果和执行一次的结果完全相等。
具体推导逻辑如下:
- 第一次运行算法时,输入是包含连续灰度值的原始图像,每个像素量化后会产生非零误差,误差扩散后最终输出所有像素均属于目标离散色域的抖动图像
- 第二次及之后运行算法时,输入图像的所有像素已经是目标色域的离散取值,每个像素的量化误差为0,没有任何误差可以扩散到相邻像素,因此输出结果和输入完全一致,无论迭代多少次都不会产生变化
现象匹配验证
你提供的两次运行结果也完全符合上述特性:
第一次迭代输出:
第十次迭代输出:
内容的提问来源于stack exchange,提问作者vesii
相关产品推荐
相关产品推荐

