图像处理--真彩转256色

来源:互联网 发布:java 转换json 编辑:程序博客网 时间:2024/05/23 22:26
 一、减色处理目的
  位图采用RGB颜色模型,是一个二维的像素矩阵的方法显示和存储的图象,矩阵中的每个元素代表一个像素。真彩图像为24位图,即包含多达224种颜色。真彩图片的特点:它没有调色板,直接用元素来表示像素的颜色值,每个元素(R,G,B)包含一个字节的红(R)色分量,一个字节的绿(G)色分量,和一个字节的蓝(B)色分量。可见真彩图片颜色细腻,但数据量巨大,一帧1024×768分辨率的真彩图片要占用空间:1024×768×3B=2.25MB。256色图为8位图,它由调色板和索引数据组成。调色板保存256种颜色的色彩分量值。索引数据的每个元素由8位组成,该8位的值为调色板的上对应颜色的索引位置。256色图的特点:只能表示256种颜色,但数据量小,一帧1024×768分辨率256色图只占用空间:1024×768+256×3=768.8kB。

二、色彩变换算法,真彩图转256色图
  要实现色彩转换,关键如何从真彩224种颜色中选出256种颜色,又要使颜色的失真比较小。常用减色算法:
(1)、流行色算法。算法的基本思路是:对彩色图像中所有色彩出现的次数进行统计分析,从而选取频率最高的N(256)种颜色,为这N(256)种颜色建立调色板。算法特点:算法简单容易实现,变换效果好,但一些出现频率较低,但对人眼视觉效果明显的信息将丢失。
(2)、中位切分算法。算法的基本思路是:在RGB彩色空间中,R、G、B三基色对应于空间的三个坐标轴,将每一坐标轴都量化为0~255,0对应于最暗(黑),255对应最亮,这样就形成一个边长为256的彩色立方体,所有可能的颜色都对应于立方体内的点。将该立方体切分为236个小立方体,每个立方体中都包含相同数量的在图像中出现的颜色点。取每个小立方体的中心点,则这些中心点构成236个颜色。算法特点:广泛应用于图像处理领域,但算法复杂,资源开销大。
(3)、八叉树颜色量化算法。算法基本思路是:将图像中使用的RGB颜色值分布到层状的八叉树中。八叉树的深度可达9层,即根节点层加上分别表示8位的R、G、B值的每一位的8层节点。较低的节点层对应于较不重要的RGB值的位(右边的位),因此,为了提高效率和节省内存,可以去掉最低部的2 ~ 3层,这样不会对结果有太大的影响。叶节点编码存储像素的个数和R、G、B颜色分量的值;而中间的节点组成了从最顶层到叶节点的路径。这是一种高效的存储方式,既可以存储图像中出现的颜色和其出现的次数,也不会浪费内存来存储图像中不出现的颜色。算法特点:效率高,效果好。

三、八叉树颜色量化算法实现
颜色量化步骤:
①、扫描图像的所有像素,将它们的数据累加到相应的节点中;遇到新的颜色则创建一个叶子节点,并将此像素的颜色数据存入其中。
②、如果叶子节点数目大于目标调色板所要的颜色数,就将部分叶子节点合并到父节点中,并将父节点转化为叶子节点,在其中存放颜色分量的累加值及其像素出现的次数。同时删除原来被合并的叶子节点。
③所有像素处理结束,遍历八叉树,将叶子节点的各颜色值求平均值作为节点的颜色分量值读出并存入目标调色板。
④再次遍历所有像素,通过每个像素的颜色值与调色板中选中的256色运算,求得一个最接近像素颜色值的调色板颜色,把该像素换相应的调色板颜色索引。

八叉树处理例子:节点RGB(109,204,170)


(具体实现代码可参考相关书籍,本文多处参考《Visual C++.NET 图像处理编程》)
原创粉丝点击