int main(int argc,char** argv){ quality=atof(argv[1]); BMP fin2 (argv[2]); BMP fin ;fin.init(fin2.w,fin2.h); BMP fout2;fout2.init(fin2.w,fin2.h); BMP fout;fout.init(fin2.w,fin2.h); double in[8][8]; double out[8][8]; double out2[8][8]; int i,j,idx; init_walsh(); init_dwt(); bmp_for(fin) RGB2YUV(fin2(x,y),fin(x,y)); int num_dat[14]; double prob_dat[14]; int sum_dat[14]; double bit_dat[14]; memset(num_dat,0,sizeof(num_dat)); int num_totallen=0; for(int c=0;c<3;c++){ for(int by=0;by<fin.h/8;by++) for(int bx=0;bx<fin.w/8;bx++){ int num_codelen=0; for(int dy=0;dy<8;dy++) for(int dx=0;dx<8;dx++){ int x=bx*8+dx; int y=by*8+dy; in[ dy][ dx]=fin(x,y)[c]; // in[ dy][ dx]=255; } //dct(in,out); //walsh(in,out); // mprint(in); //dwt(in,out); haar(in,out); // mprint(out); // idwt(out,in); // mprint(in); // return 0; // ihaar(out,in); // mprint(in); // return 0; // if(c!=0) mmap(out,(1.0/(qt[c][y][x]*quality))*); mmap(out,round); // mprint(out); vector<RunBit> rvec; vector<Code> cvec; mkRunBit(out,rvec); mkCode(rvec,cvec); for(int dy=0;dy<8;dy++) for(int dx=0;dx<8;dx++){ num_dat[(int)(log(fabs(out[dy][dx])+1.0)/log(2))]++; } // for(int i=0;i<rvec.size();i++) // printf("%d %d\n",rvec[i].zero,rvec[i].code); // printf("\n"); // for(int i=0;i<cvec.size();i++) // printf("%d %x\n",cvec[i].len,cvec[i].code); // return 0; for(int i=0;i<cvec.size();i++) num_codelen+=cvec[i].len; double comprate=(double)(8*8*8)/(double)(num_codelen); // if(comprate<3){ // mprint(out); // for(int i=0;i<rvec.size();i++) // printf("%d %d\n",rvec[i].zero,rvec[i].code); // printf("\n"); // for(int i=0;i<cvec.size();i++) // printf("%d %x\n",cvec[i].len,cvec[i].code); // printf("\n"); // printf("comprate %f",comprate); // return 0; // } num_totallen+=num_codelen; // if(c!=0) mmap(out,(qt[c][y][x]*quality)*); //idct(out,out2); //walsh(out,out2); //idwt(out,out2); ihaar(out,out2); for(int dy=0;dy<8;dy++) for(int dx=0;dx<8;dx++){ int x=bx*8+dx; int y=by*8+dy; fout(x,y)[c]=lmt3[c](out2[ dy][ dx]); } } } bmp_for(fin) YUV2RGB(fout(x,y),fout2(x,y)); for(int y=0;y<14;y++) prob_dat[y]=(double)(num_dat[y])/(double)(fin.w*fin.h*3); for(int y=0;y<14;y++) sum_dat[y]=1<<y; for(int y=0;y<14;y++) if(sum_dat[y]!=0&&prob_dat[y]!=0.0) bit_dat[y]=-log(prob_dat[y]/sum_dat[y])/log(2); double ave_bits=0; for(int y=0;y<14;y++) ave_bits+=prob_dat[y]*bit_dat[y]; for(int y=0;y<14;y++){ printf("%2d,%5d,%9d,%8.3f,%8.3f,%8.3f\n", y, sum_dat[y], num_dat[y], prob_dat[y], bit_dat[y], prob_dat[y]*bit_dat[y] ); } printf("ideal comprate:%f\n",8.0/ave_bits); double tcomprate=(double)(fin.w*fin.h*24)/(double)(num_totallen); printf("tcomprate %f\n",tcomprate); fout2.write(argv[3]); return true; }
BMP* BMP::create(char* file) { BMP* bmp = new BMP(); bmp->init(file); return bmp; }
int main(int argc,char** argv){ BMP fin (argv[1]); BMP fout;fout.init(fin.w,fin.h); double (*in )[8]; double (*out )[8]; double (*out2)[8]; fftw_plan p ; int i,j,idx; in = (double (*)[8])fftw_malloc( sizeof(double) * 8*8); out = (double (*)[8])fftw_malloc( sizeof(double) * 8*8); out2= (double (*)[8])fftw_malloc( sizeof(double) * 8*8); for(int c=0;c<3;c++){ for(int by=0;by<fin.h/8;by++) for(int bx=0;bx<fin.w/8;bx++){ for(int dy=0;dy<8;dy++) for(int dx=0;dx<8;dx++){ int x=bx*8+dx; int y=by*8+dy; in[ dy][ dx]=fin(x,y)[c]; } p = fftw_plan_r2r_2d( 8,8, (double*)in, (double*)out, FFTW_REDFT10,FFTW_REDFT10, FFTW_ESTIMATE ); fftw_execute(p); for(int dy=0;dy<8;dy++) for(int dx=0;dx<8;dx++){ out[ dy][ dx]/=8*8*4; } for(int dy=0;dy<8;dy++) for(int dx=0;dx<8;dx++){ // out[ dy][ dx]=round(out[ dy][ dx]/(qt[dy][dx]*quality)); out[ dy][ dx]=round(out[ dy][ dx]/2); } for(int dy=0;dy<8;dy++) for(int dx=0;dx<8;dx++){ // out[ dy][ dx]*=qt[dy][dx]*quality; out[ dy][ dx]*=2; } // for(int dy=0;dy<8;dy++) // for(int dx=0;dx<8;dx++){ // printf("%04d\n",(int)out[ dy][ dx]); // } p = fftw_plan_r2r_2d( 8,8, (double*)out, (double*)out2, FFTW_REDFT01,FFTW_REDFT01, FFTW_ESTIMATE ); fftw_execute(p); for(int dy=0;dy<8;dy++) for(int dx=0;dx<8;dx++){ int x=bx*8+dx; int y=by*8+dy; fout(x,y)[c]=lmt(out2[ dy][ dx]); } } } fout.write(argv[2]); fftw_destroy_plan(p); fftw_free(in); fftw_free(out); fftw_free(out2); return true; }