荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: globe (一条泡不到妞的可怜虫!), 信区: Program
标  题: 谁能帮我写写这个程序的流程图?thank you very much
发信站: 荔园晨风BBS站 (Thu Mar 14 10:56:58 2002), 转信

//          LBG算法

#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>

const int rowsize=256;
const int columnsize=256;
const int subblocksum=4096;
const int subblocksize=16;
const int codesum=256;
unsigned char spixel[rowsize][columnsize];
unsigned char tpixel[rowsize][columnsize];
unsigned char subblock[subblocksum][subblocksize];
unsigned char codebook[codesum][subblocksize];
int signal[subblocksum];

//inline int genrandnum();
int getspixel();
void getsubblock();
void inialize_codebook();
void train_codebook();
void encode();
void decode();
void cal_psnr();
FILE *resultfile;

void main()
{
        resultfile = fopen("result.txt", "a");
    if (resultfile == NULL)
        {
        cerr << "File open error" << endl;
                exit(1);
        }
        time_t begin;
        time(&begin);
        srand(begin);
        getspixel();
        getsubblock();
        inialize_codebook();
        train_codebook();
        encode();
        decode();
        cal_psnr();
        time_t end;
        time(&end);
        double elapsed=difftime(end,begin);
        cout<<"time in seconds: "<<elapsed<<endl;
        fprintf(resultfile,"time in seconds: %f\n\n\n",elapsed);
        fclose(resultfile);
}

int genrandnum()
{
        return int(0.5+rand()*(double)255/RAND_MAX);
}

int getspixel()
{
        const int num_bytes=1;
        const int count_bytes=rowsize*columnsize;
        int count;
        FILE* fp;
        if((fp=fopen("e:\\vq\\source_image\\lenna.256","rb"))==NULL)
        {
                cerr<<"Cannot open file."<<endl;
                exit(1);
        }
        count=fread(spixel,num_bytes,count_bytes,fp);
        //cout<<"count of read: "<<count<<endl;
        fclose(fp);
        return (count);
}
/*{
        int i,j;

        for(i=0;i<codesum;i++)
                for(j=0;j<subblocksize;j++)
                        codebook[i][j]=subblock[i*10][j];
}*/

void getsubblock()
{
        int m,n,j,k;
        int r_subblock,c_subblock;
        int r_spixel,c_spixel;
        for(m=0;m<64;m++)
                for(n=0;n<64;n++)
                        for(j=0;j<4;j++)
                                for(k=0;k<4;k++)
                                {
                                        r_subblock=m*64+n;
                                        c_subblock=j*4+k;
                                        r_spixel=m*4+j;
                                        c_spixel=n*4+k;
                                        subblock[r_subblock][c_subblock]
=spixel[r_spixel][c_spixel];
                                }

}
void inialize_codebook()
{
        int i,j;

        for(i=0;i<codesum;i++)
                for(j=0;j<subblocksize;j++)
                        codebook[i][j]=genrandnum();

/*      FILE * file;  //save the codebook in file
        file=fopen("randbook", "wb");
        if(file==NULL)
        {
                cout<<"Fail opening the file for codebook!"<<endl;
                exit(1);
        }
        else
        {
                int num=fwrite(codebook,sizeof(unsigned char),
codesum*subblocksize,
file);
                //cout<<"number of codewords written: "<<num<<endl;
                fclose(file);
        }
}
*/
}


void train_codebook()
{
        const double threshold=0.0001;
        double relat_error=1.0;
    double next_errorsum=2147483647;
        double first_errorsum;
        int loop_sum=0;
        int match_cellno;
        int match_minerror,match_error,difference;
        int cell_membersum[codesum];
        int cell_graysum[codesum][subblocksize];
        int max_cell,max_num;
        while(fabs(relat_error)>threshold)
        {
                first_errorsum=next_errorsum;
                next_errorsum=0.0;
                for(int i=0;i<codesum;++i)
                {
                        cell_membersum[i]=0;
                        for(int j=0;j<subblocksize;++j)
                                cell_graysum[i][j]=0;
                }

                ++loop_sum;
                //distribute subblocksum subblocks over codesum cells(codewords)
                for(i=0;i<subblocksum;++i)
                {
                        match_cellno=codesum;
                        match_minerror=7777777;
                        for(int j=0;j<codesum;j++)
                        {
                                match_error=0;
                                for(int k=0;k<subblocksize;++k)
                                {
                                        difference=subblock[i][k]-codebook[j][k]
;
                                        match_error+=difference*difference;
                                }
                                if(match_error<match_minerror)
                                {
                                        match_minerror=match_error;
                                        match_cellno=j;
                                }
                        }
                        ++cell_membersum[match_cellno];
                        for(j=0;j<subblocksize;++j)
                                cell_graysum[match_cellno][j]+=subblock[i][j];
                        next_errorsum+=double(match_minerror)/subblocksize;
                }
                next_errorsum=next_errorsum/(double)subblocksum;
        relat_error=double(next_errorsum-first_errorsum)/next_errorsum;
                if(fabs(relat_error)>threshold)
                {
                for(i=0;i<codesum;++i)     //update the codebook
                        if(cell_membersum[i]!=0)
                                for(int j=0;j<subblocksize;++j)
                                        codebook[i][j]=cell_graysum[i][j]
/cell_membersum[i];
                }
        //cal the relative error
        printf("after %3dth loop, ",loop_sum);
        printf("  absolute_error=%f",next_errorsum);
        printf("  relative_error=%f\n",relat_error);

        fprintf(resultfile,"after %3dth loop, ",loop_sum);
        fprintf(resultfile,"  absolute_error=%f",next_errorsum);
        fprintf(resultfile,"  relative_error=%f\n",relat_error);
        }

        FILE * file;  //save the codebook in file
        file=fopen("codebook", "wb");
        if(file==NULL)
        {
                cout<<"Fail opening the file for codebook!"<<endl;
                exit(1);
        }
        else
        {
                int num=fwrite(codebook,sizeof(unsigned char),
codesum*subblocksize,
file);
                //cout<<"number of codewords written: "<<num<<endl;
                fclose(file);
        }
}

void encode()
{
        int match_codeno,match_minerror,match_error,diff;
    int cell[codesum],s;

        for (int i=0;i<codesum;i++)
                cell[i]=0;
        for(i=0; i<subblocksum; ++i)
        {
                 match_codeno=codesum;
                 match_minerror=7777777;

                 for(int j=0;j<codesum;++j)
                 {
                         match_error=0;
                         for(int k=0;k<subblocksize;++k)
                         {
                                 diff=subblock[i][k]-codebook[j][k];
                                 match_error+=diff*diff;
                         }
                         if(match_error<match_minerror)
                         {
                                 match_minerror=match_error;
                                 match_codeno=j;
                         }
                 }
                 signal[i]=match_codeno;
                 cell[match_codeno]=cell[match_codeno]+1;
        }
        s=0;
        for(i=0;i<codesum;i++)
        {
                if(cell[i]==0)
                        s=s+1;
        }
        printf("empty cell=%d\n",s);
        fprintf(resultfile,"empty cell=%d\n",s);

        FILE * file;   //save the signals into file
        file=fopen("signal", "wb");
        if(file==NULL)
        {
                cout<<"Fail opening the file for signal"<<endl;
                exit(1);
        }
        else
        {
                int num=fwrite(signal,sizeof(unsigned int),subblocksum*1,file);;
                //cout<<"number of signals written: "<<num<<endl;
                fclose(file);
        }
}

void decode()
{
        int index_signal,index_book;
        int index_word,row_image,column_image;
        for(int i=0;i<64;++i)
                for(int j=0;j<64;++j)
                {
                        index_signal=i*64+j;
                        for(int m=0;m<4;++m)
                                for(int n=0;n<4;++n)
                                {
                                        index_book=signal[index_signal];
                                        index_word=m*4+n;
                                        row_image=i*4+m;
                                        column_image=j*4+n;
                                        tpixel[row_image][column_image]
=codebook[index_book][index_word];
                                }
                }
        FILE * file;   //save the target image into file
        file=fopen("tpixel", "wb");
        if(file==NULL)
        {
                cout<<"Fail opening the file for target image"<<endl;
                exit(1);
        }
        else
        {
                int num=fwrite(tpixel,sizeof(unsigned char),rowsize*columnsize,
file);
;
                //cout<<"number of signals written: "<<num<<endl;
                fclose(file);
        }
}
void cal_psnr()
{
        double PSNR;
        double diffsum=0;
        double temp=65536*(double)255*255;
        for(int i=0; i<rowsize; ++i)
                for(int j=0; j<columnsize; ++j)
                        diffsum+=(spixel[i][j]-tpixel[i][j])*(spixel[i][j]
-tpixel[i][j]);
        PSNR=10*log10(temp/diffsum);
        cout<<"PSNR="<<PSNR<<"        ";
        fprintf(resultfile,"PSNR=%f\n",PSNR);
}





--
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.1.85]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店