📄 wavelet.c
字号:
diff=new_image(w,h); max=w*h; d=diff->data; i1=image1->data; i2=image2->data; for (i=0;i<max;i++) d[i]=i2[i]-i1[i]; return diff;}/************************************************************************//* Functionname: get_intimage_infos *//* -------------------------------------------------------------------- *//* Parameter: *//* IntImage image: input image *//* IntPixel *min,*max, return minimum, maximum *//* Pixel *avg,*var: average and variance of current image *//* average and variance of current image *//* -------------------------------------------------------------------- *//* Description: *//* get statistical information of Image *//************************************************************************/void get_intimage_infos(IntImage image, IntPixel *min, IntPixel *max, Pixel *avg, Pixel *var){ int x,y; Pixel p,sp,sp2; sp=sp2=(Pixel)0.0; p= (Pixel) get_intpixel(image,0,0); *min=*max=p; for (y=0;y<image->height;y++) for (x=0;x<image->width;x++) { p= (Pixel) get_intpixel(image,x,y); *max=MAX(*max, (IntPixel) p); *min=MIN(*min, (IntPixel) p); sp+=p; sp2+=p*p; } sp=sp/image->width/image->height; sp2=sp2/image->width/image->height; *avg=sp; *var=sp2-sp*sp;}/************************************************************************//* Functionname: init_zigzag *//* -------------------------------------------------------------------- *//* Parameter: *//* Zigzag_data_struct: *//* output: will be initialized, x/y hold coordinates of *//* the first pixel *//* int width,height: *//* input: width/height of image: *//* -------------------------------------------------------------------- *//* Description: *//* initializes Zigzag_data structure for use with next_zigzag *//************************************************************************/void init_zigzag(Zigzag_data zz, int width, int height){ zz->x=0; zz->y=0; zz->dir=zigzag_up; zz->w=width; zz->h=height;}/************************************************************************//* Functionname: next_zigzag *//* -------------------------------------------------------------------- *//* Parameter: *//* Zigzag_data_struct: *//* int x,y: *//* input: current position of zigzag-scan *//* output: next position of zigzag-scan *//* int w,h: width and height of image *//* enum zigzag_direction *dir: i/o: *//* direction moving thru the image *//* -------------------------------------------------------------------- *//* Description: *//* calculates the next point (x',y') of the zigzag-scan *//* through the image with size (w,h) *//************************************************************************/void next_zigzag(Zigzag_data zz){ switch(zz->dir) { case zigzag_up: if (zz->y==0) { if (zz->x==zz->w-1) { (zz->y)++; zz->dir=zigzag_down; } else { (zz->x)++; zz->dir=zigzag_down; } } else { if (zz->x==zz->w-1) { (zz->y)++; zz->dir=zigzag_down; } else { (zz->x)++; (zz->y)--; } } break; case zigzag_down: if (zz->x==0) { if (zz->y==zz->h-1) { (zz->x)++; zz->dir=zigzag_up; } else { (zz->y)++; zz->dir=zigzag_up; } } else { if (zz->y==zz->h-1) { (zz->x)++; zz->dir=zigzag_up; } else { (zz->x)--;(zz->y)++; } } break; }}Image get_absolute_image_scaled(Image img){ Image out; int x,y; struct Image_info_struct info; Pixel scale,p; out=new_image(img->width,img->height); get_image_infos(img, &info); scale=255/MAX(fabs(info.min),fabs(info.max)); for(y=0;y<img->height;y++) for(x=0;x<img->width;x++) { p=get_pixel(img,x,y)*scale; set_pixel(out,x,y,p); } return out;} #define FLOOR_HALF(x) ((x)&1 ? ((x)-1)/2 : (x)/2)#define CEILING_HALF(x) ((x)&1 ? ((x)+1)/2 : (x)/2)#define MOD(a,b) ( (a)<0 ? ((b)-((-(a))%(b))) : (a)%(b) )Filter new_filter(int size){ Filter f; Entering; f=(Filter) calloc(1,sizeof(struct FilterStruct)); f->data=(Pixel *)calloc(size,sizeof(Pixel)); f->len=size; f->hipass=0; Leaving; return f;}Pixel get_filter_center(Filter f){ int i; Pixel p, sum, norm; if (f==NULL) return 0; sum=norm=0; for (i=0;i<f->len;i++) { p=f->data[i]; p=p*p; norm += p; sum += (i+f->start)*p; } p=sum/norm; return p;}int filter_cutoff(Image in, int in_start, int in_len, int in_step, Image out, int out_start, int out_len, int out_step, Filter f){ int i,i2,j; Pixel *out_pix, *in_pix, *f_data; int fstart,fend; /* Source interval */ Entering; PreCondition(out_len == in_len/2,"out_len != in_len/2 !!!");/* convolution: out[i]=sum_{j=start}^{end} (in[2*i-j]*f[j]) boundaries: image in [in_start ... in_start + in_len-1] image out [out_start ... out_start + out_len-1] filter f [0..f->len-1] = [f->start .. f->end] cutoff at: */ for (i=0;i<out_len;i++) { i2=2*i; fstart=i2-(in_len-1); fstart=MAX(fstart,f->start); fend=MIN(i2,f->end);#ifdef TRACE sprintf(dbgstr,"i=%d fstart=%d fend=%d\n",i,fstart,fend); Trace(dbgstr);#endif out_pix=out->data+out_start+i*out_step; in_pix=in->data+in_start+(i2-fstart)*in_step; f_data=f->data-f->start+fstart; for (j=fstart;j<=fend;j++,in_pix-=in_step,f_data++) { *out_pix += (*f_data) * (*in_pix);#ifdef TRACE sprintf(dbgstr," j=%2d in: %4.2f filter: %4.2f [%4d] [%4d] opt : %4.2f %4.2f\n", j, in->data[in_start+in_step*(i2-j)], f->data[j-f->start], in_start+in_step*(i2-j), j-f->start, *in_pix, *f_data); Trace(dbgstr);#endif } } Leaving; return 1;}int filter_inv_cutoff(Image in, int in_start, int in_len, int in_step, Image out, int out_start, int out_len, int out_step, Filter f){ int i,j; Pixel *out_pix, *in_pix, *f_data; int fstart,fend; /* Source interval */ Entering; PreCondition(out_len == in_len*2,"out_len != in_len*2 !!!");/* convolution: out[i]=sum_{j=start}^{end} (f[2*j-i]*in[j]) boundaries: image in [in_start ... in_start + in_len-1] image out [out_start ... out_start + out_len-1] filter f [0..f->len-1] = [f->start .. f->end] cutoff at: */ for (i=0;i<out_len;i++) { fstart=CEILING_HALF(f->start+i); fend=FLOOR_HALF(f->end+i); fstart=MAX(fstart,0); fend=MIN(fend,in_len-1);#ifdef TRACE sprintf(dbgstr,"i=%d fstart=%d fend=%d\n",i,fstart,fend); Trace(dbgstr);#endif out_pix=out->data+out_start+i*out_step; in_pix=in->data+in_start+fstart*in_step; f_data=f->data-f->start+2*fstart-i; for (j=fstart;j<=fend;j++,in_pix+=in_step,f_data+=2) { *out_pix += (*f_data) * (*in_pix);#ifdef TRACE sprintf(dbgstr," j=%2d in: %4.2f filter: %4.2f [%4d] [%4d] opt : %4.2f %4.2f\n", j, in->data[in_start+j*in_step], f->data[2*j-i-f->start], in_start+j*in_step, 2*j-i-f->start, *in_pix, *f_data); Trace(dbgstr);#endif } } Leaving; return 1;}int filter_periodical(Image in, int in_start, int in_len, int in_step, Image out, int out_start, int out_len, int out_step, Filter f){ int i,i2,j; Pixel *out_pix, *in_pix, *f_data; int fstart,fend; int istart; int ipix_len; Entering; PreCondition(out_len == in_len/2,"out_len != in_len/2 !!!");/* convolution: out[i]=sum_{j=start}^{end} (in[2*i-j]*f[j]) boundaries: image in [in_start ... in_start + in_len-1] image out [out_start ... out_start + out_len-1] filter f [0..f->len-1] = [f->start .. f->end]*/ ipix_len=in_len*in_step; for (i=0;i<out_len;i++) { i2=2*i; fstart=f->start; fend=f->end; istart=(i2-fstart); istart=MOD(istart,in_len);#ifdef TRACE sprintf(dbgstr,"i=%d istart=%d\n",i,istart); Trace(dbgstr);#endif out_pix=out->data+out_start+i*out_step; in_pix=in->data+in_start+istart*in_step; f_data=f->data; for (j=fstart;j<=fend;j++,f_data++) { *out_pix += (*f_data) * (*in_pix);#ifdef TRACE sprintf(dbgstr," j=%2d in: %4.2f filter: %4.2f [%4d] [%4d] opt : %4.2f %4.2f\n", j, in->data[in_start+in_step*((i2-j+in_len)%in_len)], f->data[j-f->start], in_start+in_step*((i2-j+in_len)%in_len), j-f->start, *in_pix, *f_data); Trace(dbgstr);#endif in_pix-=in_step; istart--; if (istart<0) { istart+=in_len; in_pix+=ipix_len; } } } Leaving; return 1;}int filter_inv_periodical(Image in, int in_start, int in_len, int in_step, Image out, int out_start, int out_len, int out_step, Filter f){ int i,j; Pixel *out_pix, *in_pix, *f_data; int fstart,fend; /* Source interval */ int istart; int ipix_len; Entering; PreCondition(out_len == in_len*2,"out_len != in_len*2 !!!");/* convolution: out[i]=sum_{j=start}^{end} (f[2*j-i]*in[j]) boundaries: image in [in_start ... in_start + in_len-1] image out [out_start ... out_start + out_len-1] filter f [0..f->len-1] = [f->start .. f->end]*/ ipix_len=in_len*in_step; for (i=0;i<out_len;i++) { fstart=CEILING_HALF(f->start+i); fend=FLOOR_HALF(f->end+i); istart=MOD(fstart,in_len);#ifdef TRACE sprintf(dbgstr,"i=%d fstart=%d fend=%d istart=%d\n",i,fstart,fend,istart); Trace(dbgstr);#endif out_pix=out->data+out_start+i*out_step; in_pix=in->data+in_start+istart*in_step; f_data=f->data-f->start+2*fstart-i; for (j=fstart;j<=fend;j++,f_data+=2) { *out_pix += (*f_data) * (*in_pix); #ifdef TRACE sprintf(dbgstr," j=%2d in: %4.2f filter: %4.2f [%4d] [%4d] opt : %4.2f %4.2f\n", j, in->data[in_start+(j % in_len)*in_step], f->data[2*j-i-f->start], in_start+(j%in_len)*in_step, 2*j-i-f->start, *in_pix, *f_data); Trace(dbgstr);#endif in_pix+=in_step; istart++; if (istart>=in_len) { istart-=in_len; in_pix-=ipix_len; } } } Leaving; return 1;}int filter_mirror(Image in, int in_start, int in_len, int in_step, Image out, int out_start, int out_len, int out_step, Filter f){ int i,i2,j; Pixel *out_pix, *in_pix, *f_data; int fstart,fend; int in_pos; int in_dir,in_div,in_mod; Entering; PreCondition(out_len == in_len/2,"out_len != in_len/2 !!!");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -