⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wavelet.c

📁 包含了多个matlab编程在图像中加入水印的处理代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -