抖动算法介绍

抖动算法的引入

​根据维基百科的介绍:抖动是故意应用的噪声形式,用于使量化误差随机化,从而防止图像经过量化后出现色带之类的图案。

dither1

​上图为一种抖动算法的效果示例,第2、3幅图都是由仅由像素值0和255显示出来的图。其中第2幅图以127为阈值对图像进行二值化的结果。第3幅图是图像二值化过程中运用抖动算法的结果。第3幅图在视觉效果上更接近与原图,明显比第2幅图更好。

几种抖动算法介绍

固定阈值抖动算法

​当这个固定阈值取平均值时,又叫做平均抖动算法。它将图像像素的平均值作为全局阈值来决定该点的像素值应该是0还是255。当像素值高于阈值时取255,当像素值低于阈值时取0。这种一刀切的方法实现起来非常简单,但是量化所得图像的轮廓十分明显,图像过渡不自然。

随机抖动算法

​随机抖动算法是对固定阈值抖动算法的一种改进算法,将固定的阈值改成随机数。对每个像素点,生成0-255范围内的随机数作为来与之比较,当位置像素值大于生成的随机数时,将像素值赋值为255,否则赋值为0。这样,即使原来一张图中全部是127的灰度图像,其处理结果也是一般像素值为0,一半像素值为255,整体呈现灰色。如图2,灰色部分可用黑白交替的像素点表示。

pixel

有序抖动算法

​使用一个固定数组的值作为阈值,将像素值压缩到数组取值范围内,再将其与固定数组对应位置阈值进行比较,大于阈值赋值为255,否则赋值为0。阈值数组有各种尺寸的:

random

Floyd-Steinberg 抖动算法

​ 这是抖动算法里的一个效果比较好的经典方法,是基于量化误差扩散技术的方法。对图中的每个像素点,首先找到其最接近的量化值,计算该像素点与量化值的误差,然后划分这些误差量,将其分配到其临近的像素点中去。
ordered

1
2
3
4
5
6
7
8
9
10
for each y from top to bottom
for each x from left to right
oldpixel := pixel[x][y]
newpixel := find_closest_palette_color(oldpixel)
pixel[x][y] := newpixel
quant_error := oldpixel - newpixel
pixel[x + 1][y ] := pixel[x + 1][y ] + quant_error * 7 / 16
pixel[x - 1][y + 1] := pixel[x - 1][y + 1] + quant_error * 3 / 16
pixel[x ][y + 1] := pixel[x ][y + 1] + quant_error * 5 / 16
pixel[x + 1][y + 1] := pixel[x + 1][y + 1] + quant_error * 1 / 16

几种方法效果比较

dither2