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

📄 nhwfm.c

📁 图像置乱代码
💻 C
字号:
#include <tina/all_tina.h>#include"tch.h"#define pi 3.141592654static void sort(int array[], int n){	int i, j;	int t;	for(i=0; i<n-1; i++)		for(j=i+1; j<n; j++)			if(array[i]>array[j])			{				t=array[i];				array[i]=array[j];				array[j]=t;			}/*	for(i=0; i<n; i++)			printf("%d\t", array[i]);			printf("\n");*/}void nhwfm_proc(void){	Imrect *im;	Imregion *roi;	int lx, ux, ly, uy;	int height, width;	int type;	int i, j, k, t, n;	int *hRow, *arRow;	int hist[256]={0};	int rechist[256];	double temphist[256];	int r;	static int s1, s2, s3;	double u1, u2, u3, sigma1, sigma2, sigma3;	int **imageBuf1, **imageBuf2, **imageBuf3;	double t1, t2, t3;	double **index;	double sum, indexsum;	int cnt;	int array[9];		if(stack_check_types(IMRECT, NULL)==false)			{		error("imcalc_sum: wrong types on stack", warning);		return;	}	im=(Imrect *)stack_pop(&type);	roi=im->region;	if(roi==NULL) return;	lx=roi->lx;	ux=roi->ux;	ly=roi->ly;	uy=roi->uy;	width=im->width;	height=im->height;	hRow=(int *)malloc(sizeof(int)*(ux-lx));	imageBuf1=int_matrix_alloc(height, width);	imageBuf2=int_matrix_alloc(height, width);	imageBuf3=int_matrix_alloc(height, width);	index=db_matrix(height, width);	for(i=ly; i<uy; ++i)	{		im_get_row(hRow, im, i, lx, ux);			for(j=lx; j<ux; ++j)				imageBuf1[i][j]=hRow[j];	}	for(i=0; i<height; i++)		for(j=0; j<width; j++)		{			n=imageBuf1[i][j];			hist[n]++;		}	r=(int)((double)hist[255]/(double)(height*width)*100+0.5);	printf("noise rate is %d%\n", r);	printf("%f\n", r/100.0);	for(i=0; i<255; i++)		temphist[i]=(double)hist[i]/(1-r/100.0);	temphist[255]=0.0;	/*	fixed_spline_smoothing(temphist, 256, 30);*//*	printf("\n");	for(i=0; i<256; i++)	{		rechist[i]=(int)(temphist[i]+0.5);		if(i%8==0) printf("\n");		printf("%d,%d\t", i,rechist[i]);	}	*/for(t1=49.0; t1<130.0; t1+=0.1)if(1401.682928*pow(pi*10.3*10.3, -0.25)*exp(-(t1-49.0)*(t1-49.0)/(2*39.9*39.9))<=4774.235939*pow(pi*39.9*39.9, -0.25)*exp(-(t1-130.0)*(t1-130.0)/(2*39.9*39.9))){printf("t1=%f\n", t1); break;}for(t2=130.0; t2<207.0; t2+=0.1)if(4774.235939*pow(pi*39.9*39.9, -0.25)*exp(-(t2-130.0)*(t2-130.0)/(2*39.9*39.9))<=469.964662*pow(pi*8.7*8.7, -0.25)*exp(-(t2-207.0)*(t2-207.0)/(2*8.7*8.7))){printf("t2=%f\n", t2); break;}for(t3=207.0; t3<255; t3++)if(469.964662*pow(pi*8.7*8.7, -0.25)*exp(-(t3-207.0)*(t3-207.0)/(2*8.7*8.7))<=4774.235939*pow(pi*39.9*39.9, -0.25)*exp(-(t3-130.0)*(t3-130.0)/(2*39.9*39.9))){printf("t3=%f\n", t3); break;}Send(imageBuf1, imageBuf2, height, width);		for(i=0; i<height; i++)	for(j=0; j<width; j++)		if(imageBuf2[i][j]==255) imageBuf2[i][j]=0;for(i=0; i<height; i++)	for(j=0; j<width; j++)	{		if(imageBuf2[i][j]<=t1) index[i][j]=1401.682928*pow(pi*10.3*10.3, -0.25)*exp(-(imageBuf2[i][j]-49.0)*(imageBuf2[i][j]-49.0)/(2*10.3*10.3));		else if(imageBuf2[i][j]<=t2&&imageBuf2[i][j]>t1) index[i][j]=4774.235939*pow(pi*39.9*39.9, -0.25)*exp(-(imageBuf2[i][j]-130.0)*(imageBuf2[i][j]-130.0)/(2*39.9*39.9));		else if (imageBuf2[i][j]>=t2&&imageBuf2[i][j]<=t3) index[i][j]=469.964662*pow(pi*8.7*8.7, -0.25)*exp(-(imageBuf2[i][j]-207.0)*(imageBuf2[i][j]-207.0)/(2*8.7*8.7));		else  index[i][j]=4774.235939*pow(pi*39.9*39.9, -0.25)*exp(-(imageBuf2[i][j]-130.0)*(imageBuf2[i][j]-130.0)/(2*39.9*39.9));	}		for(i=0; i<height; i++)	for(j=0; j<width; j++)		if(imageBuf2[i][j]==0) index[i][j]=0.0;		for(i=0; i<height; i++)	for(j=0; j<width; j++)	{		if(imageBuf2[i][j]==0)		{			n=0;			for(k=-1; k<=1; k++)			for(t=-1; t<=1; t++)			{				if((i+k)<0||(j+t)<0||(i+k)>=height||(j+t)>=width) continue;				else  if(imageBuf2[i+k][j+t]!=0)				{					array[n]=imageBuf2[i+k][j+t];					n++;				}				}			if(n!=0)			{				sort(array, n);				if(n%2==0) imageBuf3[i][j]=(int)((array[(n-1)/2]+array[n/2])/2);					else imageBuf3[i][j]=array[(n-1)/2];			}				else			{				sum=0.0;				indexsum=0.0;				for(k=-2; k<=2; k++)				for(t=-2; t<=2; t++)				{					if((i+k)<0||(j+t)<0||(i+k)>=height||(j+t)>=width) continue;					else					{						sum+=(double)imageBuf2[i+k][j+t]*index[i+k][j+t];						indexsum+=index[i+k][j+t];					}				}						if(indexsum!=0.0)					imageBuf3[i][j]=(int)(sum/indexsum+0.5);				else imageBuf3[i][j]=imageBuf2[i][j];				}				}    		else imageBuf3[i][j]=imageBuf2[i][j];	}	/*for(i=0; i<height; i++)	for(j=0; j<width; j++)		printf("%d\t", imageBuf3[i][j]);*/		for(i=0; i<height; i++)		for(j=0; j<width; j++)			im_put_pix(imageBuf3[i][j], im, i, j);/*-----------------------------add-start--------------------------*/	Imrect *comp_orig = NULL;	int pix;	char filename[64];	char string[25];	gcvt(r,5,string);	strcpy(filename,"result/test/nhwfm_");	strcat(filename, string);	strcat(filename,".bmp");	comp_orig = ReadGIF("/home/wzz/newimscramdegree/result/Lena.gif",1);	if (comp_orig == NULL)	{		printf("read image error.");		return;	}	for(i = 0;i < height; i ++)		for(j = 0;j < width; j++)		{			IM_PIX_GET(comp_orig, i, j, pix);			imageBuf1[i][j] = pix;		}/*---------------------------------end---------------------------*/	double mae = 0.0;	sum=0.0;	for(i=0; i<height; i++)		for(j=0; j<width; j++)		{			sum+=(double)(pow((imageBuf1[i][j]-imageBuf3[i][j]), 2));			indexsum+=(double)(imageBuf1[i][j]*imageBuf1[i][j]);				mae += fabs(imageBuf1[i][j]-imageBuf3[i][j]);		}		mae = mae/(height*width);printf("sum=%f\t, indexsum=%f\n", sum, indexsum);			printf("NMSE=%f\n", sum/indexsum);			indexsum=pow(256.0, 4);printf("PSNR=%f MAE = %f\n", 10*log10(indexsum/sum),mae);				ImrectToBMP8(im,filename);//add	//mono_image_set(im);	//stack_push(im, IMRECT, im_free);		free_int_matrix(imageBuf1, height);	free_int_matrix(imageBuf2, height);	free_int_matrix(imageBuf3, height);	free_db_matrix(index, height);	free(hRow);}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -