荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: 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软件 网络书店