抖动算法的引入
根据维基百科的介绍:抖动是故意应用的噪声形式,用于使量化误差随机化,从而防止图像经过量化后出现色带之类的图案。
上图为一种抖动算法的效果示例,第2、3幅图都是由仅由像素值0和255显示出来的图。其中第2幅图以127为阈值对图像进行二值化的结果。第3幅图是图像二值化过程中运用抖动算法的结果。第3幅图在视觉效果上更接近与原图,明显比第2幅图更好。
几种抖动算法介绍
固定阈值抖动算法
当这个固定阈值取平均值时,又叫做平均抖动算法。它将图像像素的平均值作为全局阈值来决定该点的像素值应该是0还是255。当像素值高于阈值时取255,当像素值低于阈值时取0。这种一刀切的方法实现起来非常简单,但是量化所得图像的轮廓十分明显,图像过渡不自然。
随机抖动算法
随机抖动算法是对固定阈值抖动算法的一种改进算法,将固定的阈值改成随机数。对每个像素点,生成0-255范围内的随机数作为来与之比较,当位置像素值大于生成的随机数时,将像素值赋值为255,否则赋值为0。这样,即使原来一张图中全部是127的灰度图像,其处理结果也是一般像素值为0,一半像素值为255,整体呈现灰色。如图2,灰色部分可用黑白交替的像素点表示。
有序抖动算法
使用一个固定数组的值作为阈值,将像素值压缩到数组取值范围内,再将其与固定数组对应位置阈值进行比较,大于阈值赋值为255,否则赋值为0。阈值数组有各种尺寸的:
Floyd-Steinberg 抖动算法
这是抖动算法里的一个效果比较好的经典方法,是基于量化误差扩散技术的方法。对图中的每个像素点,首先找到其最接近的量化值,计算该像素点与量化值的误差,然后划分这些误差量,将其分配到其临近的像素点中去。
1 | for each y from top to bottom |