您的位置:首页 > 其它

四叉树通常用来以紧凑的形式对数字图像进行编码(1.根据叶子节点构造四叉树 2.根据四叉树结构对加密图像进行解码 3.输出解码后的图像信息 )

2017-10-05 21:34 681 查看
#include <iostream>
#include<iomanip>
#include <memory.h>
#include<string>
#include<stdio.h>
using namespace std;

int tree[400][4];///四叉树的数组
int leaf[350];///存储叶子节点
int image[16][16];///图像的矩阵
int m;///叶子节点的数量
int ProcessTree(int x)///构造四叉树
{
int v[4];///4个叶子节点
int i,j,z;

if(leaf[x]>-1)///是叶子节点时则返回叶子节点(递归的出口)
return leaf[x];

for(i=0;i<4;i++)///递归构造四叉树
v[i]=ProcessTree(4*x+1+i);
for(i=0;i<4;i++)
{
z=0;
for(i=0;j<4;j++)
if(v[i]>v[j])
z++;
tree[x][z]=i;
}
return v[tree[x][0]];

}

///int image[16][16];
void BuildImage(int x,int x1,int y1,int x2,int y2)///根据四叉树的结构进行对四叉树的解码
{
int i,j;
if(leaf[x]>-1)
{
for(i=x1;i<=x2;i++)
for(j=y1;j<=y2;j++)
image[i][j]=leaf[x];
return;
}

BuildImage(4*x+1+tree[x][0],x1,y1,x1+(x2-x1)/2,y1+(y2-y1)/2);
BuildImage(4*x+1+tree[x][1],x1+(x2-x1)/2+1,y1,x2,y1+(y2-y1)/2);
BuildImage(4*x+1+tree[x][2],x1,y1+(y2-y1)/2+1,x1+(x2-x1)/2,y2);
BuildImage(4*x+1+tree[x][3],x1+(x2-x1)/2+1,y1+(y2-y1)/2+1,x2,x1);

}
int main()
{
int i,j,k;
int n;
int m;
int intensity;
int N;
cin>>N;
while(N--)
{
memset(tree,0,sizeof(tree));
int num;
int iCase;
cin>>iCase;
for(num=1;num<=iCase;num++)
{
cin>>n>>m;
memset(leaf,0xff,sizeof(leaf));
for(i=0;i<m;i++)
cin>>k>>intensity;
leaf[k]=intensity;
}
ProcessTree(0);
cin>>m;
memset(leaf,0xff,sizeof(leaf));
for(i=0;i<m;i++)
{
cin>>k>>intensity;
leaf[k]=intensity;
}
BuildImage(0,0,0,n-1,n-1);
if(num>1)
cout<<endl;
printf("Case%d\n\n",num);

for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<setw(4)<<image[i][j];
cout<<endl;
}
if(N)
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐