Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1532818
  • 博文数量: 114
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 1357
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-19 18:13
文章分类
文章存档

2010年(8)

2009年(9)

2008年(27)

2007年(62)

2006年(8)

我的朋友

分类: LINUX

2007-11-12 23:09:20

北京理工大学  20981班  陈罡
好久没有更新我的博客了,今天偶然上来看看,竟然有这么多朋友在对我的文章感兴趣,
真是让我非常兴奋。为了答谢各位对我的支持,我还是决定要把博客继续写下去。
 
5mbox v1.55改进了很多问题,其中一个非常重要的问题就是图片显示中的色差问题。
具体点来说,就是颜色的损失。比如现在我有一张png的图片,它是24 bpp的(24 bpp的意思是:
图片中的每个像素都由24个bit来表示,这也就是我们常见的RGB888模式,
用二进制来表示就是0000 0000 rrrr rrrr gggg gggg bbbb bbbb)
当然了,根据图片解码器的不同,它有可能是BGR模式的24 bpp。

这些都无关紧要了,只要我们知道他们是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可以有2^8个颜色,如果把它强制转换成为18 bpp的,用6 bits表示一个颜色分量,
也就是说R只能支持2^6个颜色。这就引起了颜色的丢失,也就是色差问题。
 
那么接下来如何处理这个问题呢?对于这个问题,在计算机图像处理中已经有了完整的解决方法,
那就是图像的抖动算法和图像的误差扩散算法。
 
图像抖动算法的基本原理可以参考如下的网址:
感兴趣的朋友可以用turbo c编译一下试试,呵呵,我试过了,可以用。
 
关于图像的误差扩散是目前比较流行和完善的算法,下面只介绍一下基本原理:
 降低色彩的深度. 下面三张图, 图1 是 256 级灰度过度, 图 2 是简单的将图一按就近原则, 转换成了 16 级灰度. (直接把 8bit 灰度的后 4bit 砍掉) 图3 是将图 1 用误差扩散的方法转换成 16 级灰度.
   
                   图1                 图2                    图3
很明显, 同是 16 色, 但是图三的效果明显好于图二. 其原因是使用的误差扩散算法. 顾名思义, 误差扩散, 就是将色彩深度降低时, 将像素颜色的变化误差, 扩散开去. 这使得肉眼在观察图片的时候, 相邻的像素点集合整体 的误差变小. 下面举一例来说明要容易理解的多:
在原256 级灰度图象上有一个点, 灰度值是 120 (0~255), 如果我们要将这张图转换成 16 级灰度, 最简单的方法是将每个像素点除以 16. 那么转换后的值就是 120/16=7.5 保留整数位后就是 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导致的,
如果加入了抖动算法,对比其右边的图片显示效果就可以很容易的看出其显示效果变得细腻多了。
 
这里就是简单的优化了,对于算法中必须采用的浮点数计算,可以参考如下网址进行优化:
 
毕竟已经有前辈们做过努力了,再此我就不再聒噪了,再次感谢前辈们的工作!
希望大家能继续支持5mbox!

 
阅读(3032) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-04-12 22:04:07

请问,E680上是16bpp ?怎么用法?我用MODE_BPP16不能显示图片