1、 moto a1200 研发随笔(17)-关于图片显示质量的细节问题 来源: ChinaUnix 博客 作者: ChinaUnix 博客 发布时间:2007-01-02 07:09:00 北京理工大学 20981 班 陈罡好久没有更新我的博客了,今天偶然上来看看,竟然有这么多朋友在对我的文章感兴趣,真是让我非常兴奋。为了答谢各位对我的支持,我还是决定要把博客继续写下去。转眼之间,5mbox v1.55 已研发将近完成,呵呵,看上去已非常不错了。感兴趣的朋友能登陆(官方网站) 或 去看看,目前仅对 motorola a1200/a1200e/a1200r,e6 ,e680 系列可用。而且我还编写
2、了 DIY 的工具,能允许感兴趣的朋友自己制作 DIY 相册、画册、漫画等内容。(呵呵,在这里做个广告,希望斑竹不要删除啊!)5mbox v1.55 改进了非常多问题,其中一个非常重要的问题就是图片显示中的色差问题。具体点来说,就是颜色的损失。比如目前我有一张 png 的图片,他是 24 bpp 的(24 bpp 的意思是:图片中的每个像素都由 24 个 bit 来表示,这也就是我们常见的 RGB888 模式,用二进制来表示就是 0000 0000 rrrr rrrr gggg gggg bbbb bbbb)当然了,根据图片解码器的不同,他有可能是 BGR 模式的 24 bpp。这些都无关紧要
3、了,只要我们知道他们是 24 bit 的数据表示一个像素就能了。回过头来看 a1200,a1200 的屏幕分辨率应该是 18 bpp 的,也就是传说中的 RGB666,用二进制来表示就是:00rr rrrr gggg ggbb bbbb也可能是 BRG666(我记不清了,感兴趣的朋友能参考我前面的文章,这里只讲一下原理)好,我们基本弄明白了 RGB888 和 RGB666 的差别,当我们用图片解码器把图片从压缩的 jpeg 或 png解码以后,通常得到的像素格式是 24 bpp 或 32 bpp(带有 alpha 通道的)。这个时候是 8 bits 表示一个颜色分量,也就是 R 能有 28 个
4、颜色,如果把他强制转换成为 18 bpp 的,用 6 bits 表示一个颜色分量,也就是说 R 只能支持 26 个颜色。这就引起了颜色的丢失,也就是色差问题。那么接下来怎么处理这个问题呢?对于这个问题,在计算机图像处理中已有了完整的解决方法,那就是图像的抖动算法和图像的误差扩散算法。图像抖动算法的基本原理能参考如下的网址:http:/ turbo c 编译一下试试,呵呵,我试过了,能用。关于图像的误差扩散是目前比较流行和完善的算法,下面只介绍一下基本原理:降低色彩的深度. 下面三张图, 图 1 是 256 级灰度过度, 图 2 是简单的将图一按就近原则, 转换成了 16 级灰度. (直接把 8
5、bit 灰度的后 4bit 砍掉) 图 3 是将图 1 用误差扩散的方法转换成 16 级灰度.图 1 图 2 图 3非常明显, 同是 16 色, 不过图三的效果明显好于图二. 其原因是使用的误差扩散算法. 顾名思义, 误差扩散, 就是将色彩深度降低时, 将像素颜色的变化误差, 扩散开去. 这使得肉眼在观察图片的时候, 相邻的像素点集合整体 的误差变小. 下面举一例来说明要容易理解的多: 在原 256 级灰度图象上有一个点 , 灰度值是 120 (0255), 如果我们要将这张图转换成 16 级灰度, 最简单的方法是将每个像素点除以 16. 那么转换后的值就是 120/16=7.5 保留整数位后
6、就是 7 . 这样转换后的值就有了 0.5 的误差. 最简单的误差扩散方法是将这 0.5 的误差放到这个点右边/下边的点上, 我们能按 3:2:3 的比例把他分配到右边, 右下, 下边的点上. 即, 我们把右边和下边的点加上 (0.5*16)*3/8=3, 把右下的点加上 (0.5*16)*2/8=2. 这样处理完整个图像, 要比直接截尾的效果要好的多. 实际上, 3:2:3 的误差分配方案 并不算好. 你还能试试 7:3:5:1 的分法: X 7 3 5 1 或 42 分: X 8 4 2 4 8 4 2 1 2 4 2 1 当然也不一定复杂的 Filter 就一定效果更好, 还是要视图象而定. 我觉得这个方法非常容易理解, 就不多写了, 能将其非常容易的扩展到彩色图象的处理. (只需要将颜色分成 R G B 三色素)在 linux 的 x window 下面用抖动算法做了一个实验,大体的效果如下图所示:请大家注意第一幅图的天空背景,是带有条纹的,这里的条纹就是由于直接从 24 bpp 转成 16 bpp 导致的,如果加入了抖动算法,对比其右边的图片显示效果就能非常容易的看出其显示效果变得细腻多了。这里就是简单的优化了,对于算法中必须采用的浮点数计算,能参考如下网址进行优化:http:/ 5mbox!