随着科技的快速发展,电子纸作为一种新型的显示技术,正逐渐改变着我们的阅读方式。然而,电子纸的显示效果往往会受到抖动的影响,导致阅读体验的不佳。今天,我们将深入探讨电子纸的抖动算法,为您揭示如何让阅读体验更加流畅。
一、电子纸的抖动现象
电子纸利用电泳技术来显示文字和图像。在电泳过程中,带电粒子在电场的作用下发生移动,从而在电子纸的显示区域形成图像。然而,由于电泳技术的限制,电子纸在刷新时往往会出现抖动现象。这种抖动会导致文字和图像的闪烁,影响阅读体验。
二、 抖动算法的重要性
为了解决电子纸的抖动问题,抖动算法应运而生。抖动算法通过特定的算法程序,对电子纸的显示内容进行优化处理,从而减少抖动现象的发生。通过降低抖动程度,读者可以获得更加清晰、流畅的阅读体验。
三、抖动算法的优势
提高阅读体验:通过减少抖动现象,抖动算法可以让读者更加清晰地看到电子纸上的文字和图像,从而提高阅读体验。延长电子纸寿命:由于抖动会导致电子纸内部电泳粒子的频繁移动,从而加速电子纸的老化。抖动算法可以有效减少抖动现象的发生,从而延长电子纸的使用寿命。降低眼睛疲劳:传统的纸质书籍阅读容易导致眼睛疲劳。而抖动算法可以减少电子纸的闪烁现象,让阅读过程更加舒适,降低眼睛疲劳程度。
四、抖动算法的实现
1)首先先介绍一下什么叫做图像抖动,我们可以采用这样的做法:假设原图是256级灰度,利用Bayer抖动表,做如下处理:
if (g[y][x]>>2) > bayer[y&7][x&7] then 打一白点 else 打一黑点,其中,x,y代表原图的象素坐标,g[y][x]代表该点灰度。首先将灰度右移两位,变成64级,然后将x,y做模8运算,找到Bayer表中的对应点,两者做比较,根据上面给出的判据做处理。
我们可以看到,模8运算使得原图分成了一个个8×8的小块,每个小块和8×8的Bayer表相对应。小块中的每个点都参与了比较,这样就避免了上面提到的选点和块划分过大的问题。模8运算实质上是引入了随机成分,这就是我们下面要讲到的抖动技术。
左图就是利用了这个算法,使用M3(Bayer抖动表)阵得到的;
右图是使用M4阵得到的,可见两者的差别并不是很大,所以一般用Bayer表就可以了。
2)至于什么是Bayer表呢,就是先以一个2×2的矩阵开始:设
通过递归关系有:
其中Mn和Un均为2n×2n的方阵,Un的所有元素都是1。根据这个算法,可以得到
为16级灰度的标准图案。
M3(8×8阵)比较特殊,称为Bayer抖动表。M4是一个16×16的矩阵。
根据上面的算法,如果利用M3一个象素要用8×8的图案表示,则一幅N×N的图将变成8N×8N大小。如果利用M4,就更不得了,变成16N×16N了。能不能在保持原图大小的情况下利用图案化技术呢?一种很自然的想法是:如果用M2阵,则将原图中每8×8个点中取一点,即重新采样,然后再应用图案化技术,就能够保持原图大
小。实际上,这种方法并不可行。首先,你不知道这8×8个点中找哪一点比较合适,另外,8×8的间隔实在太大了,生成的图象和原图肯定相差很大,就象下图最右边的那幅图一样。
上面提到,在应用图案化技术时,如何使图案化后的图像跟原图一样大。然后提到了一种重新采样的方法,但这种方法产生的失真极其严重,所以无法真的使用。
因此,就需要用到抖动算法。其实抖动算法的真正作用不在于设计一种方法来解决图案化技术如何减小存储空间的问题。
先给出抖动算法的作用:
- 以较少的灰度级(颜色),通过抖动来表示更大的灰度级范围(颜色范围)
- 设计一种方案,来使得图案化后的图像不要有太多的失真,尽可能在人的视觉上跟原图差不多。
然后我们来解释一下低灰度级是如何通过抖动来表示更大灰度级范围的。
我们来考虑一下, 即使使用了图案化技术,依然达不到要求的灰度级别。
举个例子:假设有一幅600×450×8bit的灰度图,当用分辨率为300dpi×300dpi的激光打印机将其打印到8×6英寸的纸上时,每个象素可以用(2400/600)×(1800/450)=4×4个点大小的图案来表示,最多能表示17级灰度,无法满足256级灰度的要求。
有两种解决方案:
(1)减小图象尺寸,由600×450变为150×113;
(2)降低图象灰度级,由256级变成16级。这两种方案都不理想。
1)Bayer抖动表
♦ 原理
假设原图是256灰度级,利用Bayer抖动表,做如下处理:
其中,x,y代表原图的象素坐标,g[y][x]代表该点灰度。首先将灰度右移两位,变成64级,然后将x,y做模8运算,找到Bayer表中的对应点,两者做比较,根据上面给出的判据做处理。
实际上,模8运算使得原图分成了一个个8×8的小块,每个小块和8×8的Bayer表相对应。小块中的每个点都参与了比较,这样就避免了上面提到的选点和块划分过大的问题。模8运算实质上是引入了随机成分,但这种随机成分还是有一定规律的。
这种抖动称为规则抖动(regular dithering)。
规则抖动的优点是算法简单,缺点是图案化有时很明显,这是因为取模运算虽然引入了随机成分,但还是有规律的。另外,点之间进行比较时,只要比标准图案上点的值大就打白点,这种做法并不理想,因为,如果当标准图案点的灰度值本身就很小,而图象中点的灰度只比它大一点儿时,图象中的点更接近白色,这是视觉效果跟原图就会相差很大。一种更好的方法是将这个误差传播到邻近的象素,就是下面要讲到的Floyd-Steinberg抖动算法。
给出matlab代码实现,用于将256灰度级的图像抖动成同样尺寸的黑白图片。
2)Floyd-Steinberg抖动算法
♦ 原理
这种算法是误差扩散算法,将当前像素的抖动误差传播到其右侧、下侧、右下侧、左下侧的像素点,其误差传播的模板如下图所示:
给出来以上误差传播模板的抖动算法的伪代码:
当然还有其他的误差传播模板,如下图所示:
给出来以上误差传播模板的抖动算法的伪代码:
注意:上面伪代码中的find_closest_palette_color(oldpixel)其实就是寻找黑点还是白点,比如对于256灰度级来说,当前像素点灰度为120时,因为小于127.5这个阈值,所以当前像素就抖动为0,就是黑点。
举个例子:
假设灰度级别的范围从b(black)到w(white),中间值t为(b+w)/2,对应256级灰度,b=0,w=255,t=127.5。设原图中象素的灰度为g,误差值为e,则新图中对应象素的值用如下的方法得到:
算法的意思很明白:以256级灰度为例,假设一个点的灰度为130,在灰度图中应该是一个灰点。由于一般图象中灰度是连续变化的,相邻象素的灰度值很可能与本象素非常接近,所以该点及周围应该是一片灰色区域。在新图中,130大于128,所以打了白点,但130离真正的白点255还差的比较远,误差e=130-255=-125比较大。将3/8×(-125)加到相邻象素后,使得相邻象素的值接近0而打黑点。下一次,e又变成正的,使得相邻象素的相邻象素打白点,这样一白一黑一白,表现出来刚好就是灰色。如果不传递误差,就是一片白色了。再举个例子,如果一个点的灰度为250,在灰度图中应该是一个白点,该点及周围应该是一片白色区域。在新图中,虽然e=-5也是负的,但其值很小,对相邻象素的影响不大,所以还是能够打出一片白色区域来。这样就验证了算法的正确性。
五、 抖动算法的未来
抖动算法作为一种革命性的技术,具有许多独特的优势和广阔的应用前景。尽管目前还存在一些问题和挑战,但随着技术的不断进步和市场需求的不断增长,相信未来抖动算法在更多领域得到广泛应用并发挥出更大的价值。
扫二维码用手机看
底部版权信息
©2007-2025 大连佳显电子有限公司 版权所有 辽ICP备08000578号-1