mat make_Y(uint Nv, uint Ns, uint Nc, mat U, double wcr) { uint i; mat Y = mat_new(Nv,Ns); it_randomize(); for (i=0; i < Ns; i++) { vec x, y, w; bvec m; x = make_x( Nv ); m = make_m( Nc ); w = make_w( U, m ); y = make_y( x, w, wcr ); mat_set_col(Y,i,y); vec_delete( x ); vec_delete( w ); vec_delete( y ); bvec_delete( m ); } return Y; }
int main() { int i, j; int w, h; int levels, ct_levels, wt_levels,level_init; double rate,rate_init; ivec dfb_levels; mat source, dest; contourlet_t *contourlet; mat wavelet; int length; unsigned char *buffer; //³õʼ»¯²ÎÊý int argc=6; rate_init=2; level_init=5; #define LEVELS 5 #define IMPULSE 100. source = mat_pgm_read("1.pgm"); h = mat_height(source); w = mat_width(source); dest = mat_new(w, h); rate = rate_init * w * h; levels = level_init; ct_levels = argc - 4; /* contourlet levels */ wt_levels = levels - ct_levels; /* wavelet levels */ dfb_levels = ivec_new(ct_levels); for(i = 0; i < ct_levels; i++) dfb_levels[i] = 4+i; buffer = bvec_new_zeros(BUFFER_SIZE); contourlet = contourlet_new(ct_levels, dfb_levels); contourlet->wt_levels = wt_levels; contourlet_transform(contourlet, source); wavelet = it_dwt2D(contourlet->low, it_wavelet_lifting_97, wt_levels); contourlet->dwt = it_wavelet2D_split(wavelet, wt_levels); /* normalize the subbands */ for(i = 0; i < ct_levels; i++) for(j = 0; j < (1 << dfb_levels[i]); j++) mat_mul_by(contourlet->high[i][j], norm_high[1+i][dfb_levels[i]][j]); mat_mul_by(contourlet->low, norm_low[ct_levels]); /* make flat images */ mat_pgm_write("dwt.pgm", wavelet); for(i = 0; i < ct_levels; i++) { char filename[256]; mat dfb_rec = mat_new((h >> i) + 1, (w >> i) + 1); if(dfb_levels[i]) dfb_flatten(contourlet->high[i], dfb_rec, dfb_levels[i]); else mat_set_submatrix(dfb_rec, contourlet->high[i][0], 0, 0); mat_incr(dfb_rec, 128); sprintf(filename, "dfb%d.pgm", i); mat_pgm_write(filename, dfb_rec); mat_decr(dfb_rec, 128); mat_delete(dfb_rec); } /* EZBC encoding */ length = ezbc_encode(contourlet, buffer, BUFFER_SIZE, rate); /* EZBC decoding */ ezbc_decode(contourlet, buffer, BUFFER_SIZE, rate); mat_pgm_write("rec_low.pgm", contourlet->dwt[0]); /* make flat images */ for(i = 0; i < ct_levels; i++) { char filename[256]; mat dfb_rec = mat_new((h >> i) + 1, (w >> i) + 1); if(dfb_levels[i]) dfb_flatten(contourlet->high[i], dfb_rec, dfb_levels[i]); else mat_set_submatrix(dfb_rec, contourlet->high[i][0], 0, 0); mat_incr(dfb_rec, 128); sprintf(filename, "rec_dfb%d.pgm", i); mat_pgm_write(filename, dfb_rec); mat_decr(dfb_rec, 128); mat_delete(dfb_rec); } /* normalize the subbands */ for(i = 0; i < ct_levels; i++) for(j = 0; j < (1 << dfb_levels[i]); j++) mat_div_by(contourlet->high[i][j], norm_high[1+i][dfb_levels[i]][j]); mat_div_by(contourlet->low, norm_low[ct_levels]); // mat_pgm_write("rec_low.pgm", contourlet->dwt[0]); /* TODO: fix this in libit */ if(wt_levels) wavelet = it_wavelet2D_merge(contourlet->dwt, wt_levels); else mat_copy(wavelet, contourlet->dwt[0]); mat_pgm_write("rec_dwt.pgm", wavelet); contourlet->low = it_idwt2D(wavelet, it_wavelet_lifting_97, wt_levels); contourlet_itransform(contourlet, dest); contourlet_delete(contourlet); mat_pgm_write("rec.pgm", dest); printf("rate = %f PSNR = %f\n", length * 8. / (w*h), 10*log10(255*255/mat_distance_mse(source, dest, 0))); ivec_delete(dfb_levels); mat_delete(dest); mat_delete(source); bvec_delete(buffer); return(0); }