四叉树存储2^n大小的图像
来源:互联网 发布:做淘宝客服需要会什么 编辑:程序博客网 时间:2024/05/16 17:14
#include <stdlib.h>
功能: 构造灰度图像对应的四叉树。如果图像只有单个像素、或者所有像素取值相等,则表示为四叉树的叶子几点;否则图像被划分为四个象限,并递归构造四叉树。
输入: image: 灰度图像,每个像素用一个字节表示256级灰度
imageSize:图像大小为imageSize*imageSize,imageSize有效取值为2的指数
输出: tree: 灰度图像对应的四叉树
返回: 如果构造成功则返回0,否则返回-1
{
//0到m/2, n/2到n-1;
int m=imageSize;
int n=imageSize;
int k=0;
for(int i=0;i<=m/2-1;i++)
{
for(int j=n/2;j<=n-1;j++)
{
nimage[k++]=image[n*i+j];
}
}
}
void extractTOP_LEFT(const unsigned char* image,char* nimage,int imageSize)
{
//0到m/2, n/2到n-1;
int m=imageSize;
int n=imageSize;
int k=0;
for(int i=0;i<=m/2-1;i++)
{
for(int j=0;j<=n/2-1;j++)
{
nimage[k++]=image[n*i+j];
}
}
}
void extractBOTTOM_LEFT(const unsigned char* image,char* nimage,int imageSize)
{
//0到m/2, n/2到n-1;
int m=imageSize;
int n=imageSize;
int k=0;
for(int i=m/2;i<=m-1;i++)
{
for(int j=0;j<=n/2-1;j++)
{
nimage[k++]=image[n*i+j];
}
}
}
void extractBOTTOM_RIGHT(const unsigned char* image,char* nimage,int imageSize)
{
//0到m/2, n/2到n-1;
int m=imageSize;
int n=imageSize;
int k=0;
for(int i=m/2;i<=m-1;i++)
{
for(int j=n/2;j<=n-1;j++)
{
nimage[k++]=image[n*i+j];
}
}
}
#include <math.h>
int CreateQTreeForGrayScaleImage(const unsigned char* image, int imageSize, QTree **tree)
{
if(image==NULL||tree==NULL) return -1;
int j=0;
while(pow(float(2),float(j))<float(imageSize))
{
j++;
}
if(imageSize!=pow(float(2),float(j))) return -1;
char pivot=image[0];
bool flag=true;
for(int i=0;i<(imageSize*imageSize);i++)
{
if(image[i]=='\0') return -1;
if((image[i]-pivot)!=0) flag=false;
}
if(imageSize==0||imageSize==1||flag)
{
QTree* ptree=new QTree;
ptree->children[TOP_RIGHT]=NULL;
ptree->children[TOP_LEFT]=NULL;
ptree->children[BOTTOM_LEFT]=NULL;
ptree->children[BOTTOM_RIGHT]=NULL;
ptree->isLeaf=true;
ptree->pixel=image[0];
QTree** temp=tree;
*temp=ptree; // 怎么可能改变tree的值呢?
return 0;
}
else
{
QTree* ptree=new QTree;
QTree** temp=tree;
*temp=ptree; // 怎么可能改变tree的值呢?
ptree->isLeaf=false;
ptree->children[TOP_LEFT]=NULL;
ptree->children[TOP_RIGHT]=NULL;
ptree->children[BOTTOM_LEFT]=NULL;
ptree->children[BOTTOM_RIGHT]=NULL;
char* nimage=new char[imageSize*imageSize/4];
extractTOP_RIGHT(image,nimage,imageSize);
CreateQTreeForGrayScaleImage(reinterpret_cast<const unsigned char*>(nimage), imageSize/2, &(ptree->children[TOP_RIGHT]));
extractTOP_LEFT(image,nimage,imageSize);
CreateQTreeForGrayScaleImage(reinterpret_cast<const unsigned char*>(nimage), imageSize/2, &(ptree->children[TOP_LEFT]));
extractBOTTOM_LEFT(image,nimage,imageSize);
CreateQTreeForGrayScaleImage(reinterpret_cast<const unsigned char*>(nimage), imageSize/2, &(ptree->children[BOTTOM_LEFT]));
extractBOTTOM_RIGHT(image,nimage,imageSize);
CreateQTreeForGrayScaleImage(reinterpret_cast<const unsigned char*>(nimage), imageSize/2, &(ptree->children[BOTTOM_RIGHT]));
delete nimage;
}
return 0;
}
/*
功能: 调整图像灰度,需考虑溢出,上溢时取值255,下溢时取值0
输入: tree: 灰度图像对应的四叉树
delta: 灰度变化值,正数表示上调,负数表示下调。
*/
void AdjustGrayScale(QTree *tree, int delta)
{
if (tree != NULL)
{
for(int i=0;i<=3;i++)
{
if(NULL!=tree->children[i])
{
if(tree->children[i]->pixel+delta>255)
{
tree->children[i]->pixel=255;
}
else
{
tree->children[i]->pixel+=delta;
}
}
else return;
}
for (int i = TOP_RIGHT; i <= BOTTOM_RIGHT; i++)
{
AdjustGrayScale(tree->children[i],delta);
}
}
}
/* 功能:删除指定四叉树,释放各节点内存 */
void DestroyQTree(QTree *tree)
{
if (tree != NULL)
{
for (int i = TOP_RIGHT; i <= BOTTOM_RIGHT; i++)
DestroyQTree(tree->children[i]);
free(tree);
}
}
typedef struct structQTree QTree;
struct structQTree
{
unsigned char pixel;
bool isLeaf;
QTree *children[4];
};
/* 象限 */
enum
{
TOP_RIGHT = 0,
TOP_LEFT,
BOTTOM_LEFT,
BOTTOM_RIGHT
};
功能: 构造灰度图像对应的四叉树。如果图像只有单个像素、或者所有像素取值相等,则表示为四叉树的叶子几点;否则图像被划分为四个象限,并递归构造四叉树。
输入: image: 灰度图像,每个像素用一个字节表示256级灰度
imageSize:图像大小为imageSize*imageSize,imageSize有效取值为2的指数
输出: tree: 灰度图像对应的四叉树
返回: 如果构造成功则返回0,否则返回-1
*/
{
//0到m/2, n/2到n-1;
int m=imageSize;
int n=imageSize;
int k=0;
for(int i=0;i<=m/2-1;i++)
{
for(int j=n/2;j<=n-1;j++)
{
nimage[k++]=image[n*i+j];
}
}
}
void extractTOP_LEFT(const unsigned char* image,char* nimage,int imageSize)
{
//0到m/2, n/2到n-1;
int m=imageSize;
int n=imageSize;
int k=0;
for(int i=0;i<=m/2-1;i++)
{
for(int j=0;j<=n/2-1;j++)
{
nimage[k++]=image[n*i+j];
}
}
}
void extractBOTTOM_LEFT(const unsigned char* image,char* nimage,int imageSize)
{
//0到m/2, n/2到n-1;
int m=imageSize;
int n=imageSize;
int k=0;
for(int i=m/2;i<=m-1;i++)
{
for(int j=0;j<=n/2-1;j++)
{
nimage[k++]=image[n*i+j];
}
}
}
void extractBOTTOM_RIGHT(const unsigned char* image,char* nimage,int imageSize)
{
//0到m/2, n/2到n-1;
int m=imageSize;
int n=imageSize;
int k=0;
for(int i=m/2;i<=m-1;i++)
{
for(int j=n/2;j<=n-1;j++)
{
nimage[k++]=image[n*i+j];
}
}
}
#include <math.h>
int CreateQTreeForGrayScaleImage(const unsigned char* image, int imageSize, QTree **tree)
{
if(image==NULL||tree==NULL) return -1;
int j=0;
while(pow(float(2),float(j))<float(imageSize))
{
j++;
}
if(imageSize!=pow(float(2),float(j))) return -1;
char pivot=image[0];
bool flag=true;
for(int i=0;i<(imageSize*imageSize);i++)
{
if(image[i]=='\0') return -1;
if((image[i]-pivot)!=0) flag=false;
}
if(imageSize==0||imageSize==1||flag)
{
QTree* ptree=new QTree;
ptree->children[TOP_RIGHT]=NULL;
ptree->children[TOP_LEFT]=NULL;
ptree->children[BOTTOM_LEFT]=NULL;
ptree->children[BOTTOM_RIGHT]=NULL;
ptree->isLeaf=true;
ptree->pixel=image[0];
QTree** temp=tree;
*temp=ptree; // 怎么可能改变tree的值呢?
return 0;
}
else
{
QTree* ptree=new QTree;
QTree** temp=tree;
*temp=ptree; // 怎么可能改变tree的值呢?
ptree->isLeaf=false;
ptree->children[TOP_LEFT]=NULL;
ptree->children[TOP_RIGHT]=NULL;
ptree->children[BOTTOM_LEFT]=NULL;
ptree->children[BOTTOM_RIGHT]=NULL;
char* nimage=new char[imageSize*imageSize/4];
extractTOP_RIGHT(image,nimage,imageSize);
CreateQTreeForGrayScaleImage(reinterpret_cast<const unsigned char*>(nimage), imageSize/2, &(ptree->children[TOP_RIGHT]));
extractTOP_LEFT(image,nimage,imageSize);
CreateQTreeForGrayScaleImage(reinterpret_cast<const unsigned char*>(nimage), imageSize/2, &(ptree->children[TOP_LEFT]));
extractBOTTOM_LEFT(image,nimage,imageSize);
CreateQTreeForGrayScaleImage(reinterpret_cast<const unsigned char*>(nimage), imageSize/2, &(ptree->children[BOTTOM_LEFT]));
extractBOTTOM_RIGHT(image,nimage,imageSize);
CreateQTreeForGrayScaleImage(reinterpret_cast<const unsigned char*>(nimage), imageSize/2, &(ptree->children[BOTTOM_RIGHT]));
delete nimage;
}
return 0;
}
/*
功能: 调整图像灰度,需考虑溢出,上溢时取值255,下溢时取值0
输入: tree: 灰度图像对应的四叉树
delta: 灰度变化值,正数表示上调,负数表示下调。
*/
void AdjustGrayScale(QTree *tree, int delta)
{
if (tree != NULL)
{
for(int i=0;i<=3;i++)
{
if(NULL!=tree->children[i])
{
if(tree->children[i]->pixel+delta>255)
{
tree->children[i]->pixel=255;
}
else
{
tree->children[i]->pixel+=delta;
}
}
else return;
}
for (int i = TOP_RIGHT; i <= BOTTOM_RIGHT; i++)
{
AdjustGrayScale(tree->children[i],delta);
}
}
}
/* 功能:删除指定四叉树,释放各节点内存 */
void DestroyQTree(QTree *tree)
{
if (tree != NULL)
{
for (int i = TOP_RIGHT; i <= BOTTOM_RIGHT; i++)
DestroyQTree(tree->children[i]);
free(tree);
}
}
0 0
- 四叉树存储2^n大小的图像
- 改变图像的大小
- 图像的大小的计算
- 图像分辨率和图像大小的计算
- 图像分辨率和图像大小的计算
- 图像分辨率和图像大小的计算
- 图像的四叉树深度优先存储
- 图像的四叉树广度优先存储
- 弹出图像大小的窗口
- 调整图像大小的PHP
- opencv2改变图像的大小
- 试比较2的n次方加2与n平方的大小。 (n属于N*). 用数学规纳发证明
- 图像的存储
- 图像的存储组织形式
- Java的图像旋转 指定图像大小 水平翻转图像
- n个结点的堆中结点i的子树大小至多为2n/3
- 寻找大小为n的数组中出现次数超过n/2的那个数
- 大小端存储的问题
- 17周 项目1.2
- 解决bundle install 和 bundle update特别慢的状况
- Barcode 的问题
- Extjs清空from中的数据
- 面试英语自我介绍的常用基本的句子
- 四叉树存储2^n大小的图像
- 17周项目1(1)
- disabled 与 readonly的区别(禁止编辑)
- C#计算代码执行时间的方法
- 第十四章课后作业
- java.lang.UnsatisfiedLinkError: Native method not found
- poj3181Dollar Dayz(完全背包+记录组合种数+高精度)
- C#链表;循环链表
- JSP <c:choose>