图像抖动

来源:互联网 发布:js window scroll事件 编辑:程序博客网 时间:2024/04/29 22:40

什么是图像抖动技术?我们先通过针式打印机进行简单的理解:我们知道针式打印机工作原理比较简单:将色带上的墨粉打到图片上通过黑白记录图片信息,最后达到打印图片的效果。那么既然针式打印机只是简单的通过针孔敲击记录图像黑白,为什么针式打印机能够打印灰度图?

例如图像中某一像素值为50,那么简单的黑白点怎样表现这一灰度级?其实在打印的某一像素中有很多(如16*16)黑白点,如果有256针孔敲击的点,那么如果全是黑点则代表灰度值为零,仅有一个黑点表示灰度值为1,以此类推,没有黑点(即有256个白点)则表示灰度值为256,以此用来表示灰度图像。

那么存在这样一种情况:原始图像的像素灰度级是256(使用【0,255】来表示一个像素),但是激光打印机在每个像素仅能打印(4*4)16个点很明显这无法完整的表达图像信息,甚至造成打印的图像失真,因此我们引入图像抖动技术。下面介绍的Floyd-Steinberg算法就采用了这种技术。
 
假设灰度级别的范围从b(black)到w(white),中间值t 为(b+w)/2,对应256 级灰度,b=0,w=255,t=127.5 。设原
图中象素的灰度为g,误差值为e ,则新图中对应象素的值用如下的方法得到:
 
if g > t then
 
打白点
 
e=g-w
 
else 
 
打黑点
 
e=g-b
 
3/8  × e  加到右边的象素
 
3/8  × e  加到下边的象素
 
1/4  × e  加到右下方的象素
 
算法的意思很明白:以256 级灰度为例,假设一个点的灰度为130 ,在灰度图中应该是一个灰点。由于一般图象中灰度是连续变化的,相邻象素的灰度值很可能与本象素非常接近,所以该点及周围应该是一片灰色区域。在新图中,130 大于128 ,所以打了白点,但130 离真正的白点255 还差的比较远,误差e=130-255=-125 比较大。,将3/8×(-125) 加到相邻象素后,使得相邻象素的值接近0 而打黑点。下一次,e 又变成正的,使得相邻象素的相邻象素打白点,这样一白一黑一白,表现出来刚好就是灰色。如果不传递误差,就是一片白色了。再举个例子,如果一个点的灰度为250  ,在灰度图中应该是一个白点,该点及周围应该是一片白色区域。在新图中,虽然e=-5 也是负的,但其值很小,对相邻象素的影响不大,所以还是能够打出一片白色区域来。这样就验证了算法的正确性。其它的情况大家可以自己推敲。

0 0
原创粉丝点击