基于八叉树颜色删减C++实现

基于八叉树颜色删减C++实现

一、减色处理目的

位图采用RGB颜色模型,是一个二维的像素矩阵的方法显示和存储的图象,矩阵中的每个元素代表一个像素。真彩图像为24位图,即包含多达224种颜色。真彩图片的特点:它没有调色板,直接用元素来表示像素的颜色值,每个元素(R,G,B)包含一个字节的红®色分量,一个字节的绿(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种颜色,又要使颜色的失真比较小八叉树颜色量化算法。算法基本思路是:将图像中使用的RGB颜色值分布到层状的八叉树中。八叉树的深度可达9层,即根节点层加上分别表示8位的R、G、B值的每一位的8层节点。较低的节点层对应于较不重要的RGB值的位(右边的位),因此,为了提高效率和节省内存,可以去掉最低部的2 ~ 3层,这样不会对结果有太大的影响。叶节点编码存储像素的个数和R、G、B颜色分量的值;而中间的节点组成了从最顶层到叶节点的路径。这是一种高效的存储方式,既可以存储图像中出现的颜色和其出现的次数,也不会浪费内存来存储图像中不出现的颜色。算法特点:效率高,效果好

三、八叉树颜色量化算法实现

颜色量化步骤:

①、扫描图像的所有像素,将它们的数据累加到相应的节点中;遇到新的颜色则创建一个叶子节点,并将此像素的颜色数据存入其中。

②、如果叶子节点数目大于目标调色板所要的颜色数,就将部分叶子节点合并到父节点中,并将父节点转化为叶子节点,在其中存放颜色分量的累加值及其像素出现的次数。同时删除原来被合并的叶子节点。

③所有像素处理结束,遍历八叉树,将叶子节点的各颜色值求平均值作为节点的颜色分量值读出并存入目标调色板。

④再次遍历所有像素,通过每个像素的颜色值与调色板中选中的256色运算,求得一个最接近像素颜色值的调色板颜色,把该像素换相应的调色板颜色索引。

八叉树处理例子:节点RGB(109,204,170)
在这里插入图片描述

三、处理结果

真彩色
在这里插入图片描述

颜色删减之后的图像

在这里插入图片描述

四、代码实现C++

#define _CRT_SECURE_NO_DEPRECATE
#include <windows.h>
#include <cstdio>
#include <cmath>
#include<iostream>
#include<string.h>
#include<cstring>
using namespace std;
typedef unsigned char uint8;
struct octNode
{
	long long cnt, rSum, gSum, bSum;
	bool isLeaf;
	int depth;
	octNode* child[8];
	octNode* pre;
	octNode* next;
	octNode()
	{

		cnt = 0;
		rSum = 0;
		gSum = 0;
		bSum = 
  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值