四叉树存储2^n大小的图像

来源:互联网 发布:做淘宝客服需要会什么 编辑:程序博客网 时间:2024/05/16 17:14
#include <stdlib.h>



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
     

*/




void extractTOP_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=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
原创粉丝点击