📄 denoise_3sigma.c
字号:
void FFT_proc(){ Imrect *srcIm,*destIm; int width, height;
Imregion *roi; float pix; double fftdata[nMAX*2]; double outdata[nMAX]; int i,j,u,v; srcIm = read_image(); width = srcIm->width;
height = srcIm->height; roi = srcIm->region;
if (roi == NULL) return ; //destIm = im_alloc( height, width, roi, float_v ); for (i = 0; i < height ; i++)
{
for (j = 0; j< width ; j++)
{ IM_PIX_GET(srcIm, i, j, pix); gdata[256*i+j] = pix; //printf("gdata[%d] = %f\n",256*i+j,gdata[256*i+j]); }
} for (i = 0 ;i < nMAX ;i ++) { fftdata[i*2] = gdata[i]; fftdata[i*2+1] = 0.0; } four1(fftdata-1, nMAX, 1); for (i = 0;i < nMAX; i ++) outdata[i] = sqrt(fftdata[i*2]*fftdata[i*2] + fftdata[i*2+1]*fftdata[i*2+1]); for (i = 0 ;i < nMAX ;i ++) printf(" outdata[%d] = %f\n",i,outdata[i]); FILE *fp; if((fp=fopen("FFT.txt","w"))==NULL) { format("Can't open the file!\n"); exit(0); } for (i = 32768;i < nMAX;i++) fprintf(fp,"%d %f\n",i,outdata[i]); fclose(fp); printf("ok!!!\n");}void FFT_proc1(){ #define NN 64 float fftdata[NN]; float data[NN]; int i; for (i = 0 ;i < NN ;i ++) data[i] = 5.0; for (i = 0 ;i < NN ;i ++) fftdata[i] = data[i]; realft(fftdata-1, NN, 1); for (i = 0 ;i < NN ;i ++) printf(" fftdata[%d] = %f\n",i,fftdata[i]); FILE *fp; if((fp=fopen("tFFT.txt","w"))==NULL) { format("Can't open the file!\n"); exit(0); } for (i = 0;i < NN;i++) fprintf(fp,"%d %f\n",i,fftdata[i]); fclose(fp); if((fp=fopen("data.txt","w"))==NULL) { format("Can't open the file!\n"); exit(0); } for (i = 0;i < NN;i++) fprintf(fp,"%f\n",data[i]); fclose(fp); printf("ok!!!\n");} /*--------------------------------------------------------------------------- To get the location of the min in the index. ---------------------------------------------------------------------------*/
int index_min(data,n)
double data[]; int n;
{
int i, imin=0; double a, min=data[0];
for(i=1;i<n;i++)
if((a=data[i])<min) {imin=i; min=a;}
return imin;
}
/*--------------------------------------------------------------------------- To get the location of the max in the index. ---------------------------------------------------------------------------*/
int index_max(data,n)
double data[]; int n;
{
int i, imax=0; double a, max=data[0];
for(i=1;i<n;i++)
if((a=data[i])>max) {imax=i; max=a;}
return imax;
}
/*--------------------------------------------------------------------------- motion detect using 3sigma(median). use median to estimate the sigma; use 3sigma to detect outline pionts(motion). ---------------------------------------------------------------------------*/void Motion_proc(){ Imrect *orig_a; Imrect *orig_b; Imrect *dest_a_b;/*----------------Pop the org_image from stack------------------- int type; if (stack_check_types(IMRECT, NULL) == false)
{ printf("pop 图像b 失败!\n");
error("Motion_proc : wrong types on stack", warning);
return;
}
orig_b = (Imrect *) stack_pop(&type); tv_imrect2(tv1, orig_b); printf("pop 图像b 成功!\n"); if (stack_check_types(IMRECT, NULL) == false)
{ printf("pop 图像a 失败!\n");
error("Motion_proc : wrong types on stack", warning);
return;
}
orig_a = (Imrect *) stack_pop(&type); tv_imrect2(tv, orig_a); printf("pop 图像a 成功!\n");/*-----------------------------------------------------------------------------*/
int width, height;
double pix;
int lx, ux, ly, uy;
Imregion *roi; int i,j; orig_a = ReadGIF("/home/wzz/newimscramdegree/cs/cs0.gif", 1); orig_b = ReadGIF("/home/wzz/newimscramdegree/cs/cs10.gif", 1);
width = orig_a->width;
height = orig_a->height;
roi = orig_a->region;
if (roi == NULL) return ;
lx = roi->lx;
ux = roi->ux;
ly = roi->ly;
uy = roi->uy; printf("%d %d %d %d\nwidth = %d height = %d\n",lx, ux, ly, uy,width,height);/*------------------------------------------------------------------------- double data[nMAX]; double fabs_data_g[nMAX]; Imrect *im_gauss_4; im_gauss_4 = im_alloc( height, width, roi, int_v ); i = 0; data[i] = gauss_random(0, 0.0, sqrt(4.0)); IM_PIX_SET(im_gauss_4, i/width, i%width, fabs_data_g[i]); for(i = 1; i < nMAX; i ++) { data[i] = gauss_random(1, 0.0, sqrt(4.0)); fabs_data_g[i] = fabs(data[i]); IM_PIX_SET(im_gauss_4, i/width, i%width, (((int)data[i]+255)%255)); //IM_PIX_SET(im_gauss_4, i/width, i%width, (int)data[i]+128); } double av,dv,md; av=get_mean(data,nMAX); dv=sqrt(get_var(data,nMAX)); md=get_med(fabs_data_g,nMAX); printf("ave = %f dvar = %f med = %f med*1.4826 = %f\n",av,dv,md,md*1.4826); //gif_write_file(im_gauss_4,"im_gauss_4.gif");/*------------------------------------------------------------------------*/ int WxH = width*height; double a_data[width*height]; double b_data[width*height]; double a_b_data[width*height],fabs_0_data[width*height],a_b_0_data[width*height]; double ave,var,med; dest_a_b = im_alloc( height, width, roi, orig_a->vtype );int count = 0; for(i = ly; i < uy; i ++) for(j = lx; j < ux; j ++) { IM_PIX_GET(orig_a, i, j, pix); a_data[width*i+j] = pix; IM_PIX_GET(orig_b, i, j, pix); b_data[width*i+j] = pix; a_b_data[width*i+j] = b_data[width*i+j] - a_data[width*i+j]; if(a_b_data[width*i+j] != 0.0) count++; //fabs_data[width*i+j] = fabs(a_b_data[width*i+j]); /*if(a_b_data[width*i+j] > 0) IM_PIX_SET(dest_a_b, i, j,(int)a_b_data[width*i+j] ); if(a_b_data[width*i+j] <= 0) IM_PIX_SET(dest_a_b, i, j,((int)a_b_data[width*i+j] + 255));*/ IM_PIX_SET(dest_a_b, i, j,(((int)a_b_data[width*i+j]+256)%256)); //IM_PIX_SET(dest_a_b, i, j,(int)fabs_data[width*i+j]); //printf("[%d %d]= %f ",i,j,a_b_data[width*i+j]); }printf("%d ",count);/*----------------------------------- double max,min; double k; int min_t,max_t; min_t = index_min(a_b_data,width*height); min = a_b_data[min_t]; printf("min = %f \n",min); max_t = index_max(a_b_data,width*height); max = a_b_data[max_t]; printf("max = %f \n",max); k = 255/(max - min); printf("k = %f \n",k); for(i = 0; i < width*height; i ++) { a_b_data[i] = (a_b_data[i] - min)*k; IM_PIX_SET(dest_a_b, i/width, i%width,floor(a_b_data[i])); }/*----------------------------------- double max,min; double k; int min_t,max_t; min_t = index_min(fabs_data,width*height); min = fabs_data[min_t]; printf("min = %f \n",min); max_t = index_max(fabs_data,width*height); max = fabs_data[max_t]; printf("max = %f \n",max); k = 255/(max - min); printf("k = %f \n",k); for(i = 0; i < width*height; i ++) { fabs_data[i] = (fabs_data[i] - min)*k; IM_PIX_SET(dest_a_b, i/width, i%width,floor(fabs_data[i])); }/*-----------------------------------*/ //tv_imrect2(tv2, dest_a_b); //gif_write_file(dest_a_b,"f_np-dp.gif"); ave = var = med =0; ave = get_mean(a_b_data,width*height); printf("\na_b ave = %f\n",ave); var = get_var(a_b_data,width*height); printf("a_b dvar = %f \n",sqrt(var)); //med = get_med(fabs_data,WxH); //printf("fabs med = %f med*1.4826 = %f\n",med,med*1.4826); double meanmed; meanmed = get_med(a_b_data,WxH); printf("meanmed = %f\n",meanmed); for(i = 0; i < width*height; i ++) { a_b_0_data[i] = a_b_data[i] - meanmed;// move to 0 fabs_0_data[i] = fabs(a_b_0_data[i]); //IM_PIX_SET(dest_a_b, i/width, i%width,floor(fabs_data[i])); } ave = get_mean(a_b_0_data,width*height); printf("\na_b_0_data ave = %f\n",ave); var = get_var(a_b_0_data,width*height); printf("a_b_0_data dvar = %f \n",sqrt(var)); med = get_med(fabs_0_data,WxH); printf("fabs_0 med = %f med*1.4826 = %f\n",med,med*1.4826); double sigma3_m,sigma3; //sigma3 = sqrt(var)*3; sigma3_m = med*1.4826*3; sigma3 = sigma3_m; /*for(i = ly; i < uy; i ++) for(j = lx; j < ux; j ++) { if(fabs_data[width*i+j] < sigma3) IM_PIX_SET(dest_a_b, i, j,128);//0,128,255 }*/ /*for(i = 0; i < width*height; i ++) { if(fabs_data[width*i+j] < sigma3) IM_PIX_SET(dest_a_b, i/width, i%width,128); }*/ printf("WxH = %d\n",WxH); for(i = 0; i < width*height; i ++) { if(fabs_0_data[i] < sigma3) { //a_b_data[i] = 0; //fabs_data[i] = 0; IM_PIX_SET(dest_a_b, i/width, i%width,0); } }/*----------------------------------- double max,min; double k; int min_t,max_t; min_t = index_min(a_b_data,width*height); min = a_b_data[min_t]; printf("min = %f \n",min); max_t = index_max(a_b_data,width*height); max = a_b_data[max_t]; printf("max = %f \n",max); k = 255/(max - min); printf("k = %f \n",k); for(i = 0; i < width*height; i ++) { a_b_data[i] = (a_b_data[i] - min)*k; IM_PIX_SET(dest_a_b, i/width, i%width,floor(a_b_data[i])); //printf("%d ",i); }/*-----------------------------------*/ gif_write_file(dest_a_b,"f_np-dp_m.gif"); printf("done\n");}/*void Ave_3sigma_proc(){ Imrect *orig_b; Imrect *dest_b; int type; if (stack_check_types(IMRECT, NULL) == false)
{ printf("pop 图像b 失败!\n");
error("Motion_proc : wrong types on stack", warning);
return;
}
orig_b = (Imrect *) stack_pop(&type); printf("pop 图像b 成功!\n"); int width, height;
double pix;
int lx, ux, ly, uy;
Imregion *roi; int i,j;
width = orig_b->width;
height = orig_b->height;
roi = orig_b->region;
if (roi == NULL) return ;
lx = roi->lx;
ux = roi->ux;
ly = roi->ly;
uy = roi->uy; printf("%d %d %d %d\nwidth = %d height = %d\n",lx, ux, ly, uy,width,height); double b_data[width*height]; double ave,var; dest_b = im_alloc( height, width, roi, orig_b->vtype ); for(i = ly; i < uy; i ++) for(j = lx; j < ux; j ++) { IM_PIX_GET(orig_b, i, j, pix); b_data[width*i+j] = pix; IM_PIX_SET(dest_b, i, j,pix); } ave = var = 0; ave = get_mean(b_data,width*height); printf("\nave = %f\n",ave); var = get_var(b_data,width*height); printf("dvar = %f \n",sqrt(var)); double sigma3; sigma3 = sqrt(var)*3; for(i = 0; i < width*height; i ++) { if(b_data[i] < sigma3) { IM_PIX_SET(dest_b, i/width, i%width,0); } } gif_write_file(dest_b,"Ave_3sigma_b.gif"); printf("done\n");}void Med_3sigma_proc(){ Imrect *orig_b; Imrect *dest_b; int type; if (stack_check_types(IMRECT, NULL) == false)
{ printf("pop 图像b 失败!\n");
error("Motion_proc : wrong types on stack", warning);
return;
}
orig_b = (Imrect *) stack_pop(&type); printf("pop 图像b 成功!\n"); int width, height;
double pix;
int lx, ux, ly, uy;
Imregion *roi; int i,j;
width = orig_b->width;
height = orig_b->height;
roi = orig_b->region;
if (roi == NULL) return ;
lx = roi->lx;
ux = roi->ux;
ly = roi->ly;
uy = roi->uy; printf("%d %d %d %d\nwidth = %d height = %d\n",lx, ux, ly, uy,width,height); double b_data[width*height]; double med; dest_b = im_alloc( height, width, roi, orig_b->vtype ); for(i = ly; i < uy; i ++) for(j = lx; j < ux; j ++) { IM_PIX_GET(orig_b, i, j, pix); b_data[width*i+j] = pix; IM_PIX_SET(dest_b, i, j,pix); } med =0; med = get_med(b_data,width*height); printf("med = %f med*1.4826 = %f\n",med,med*1.4826); double sigma3_m; sigma3_m = med*1.4826*3; for(i = 0; i < width*height; i ++) { if(b_data[i] < sigma3_m) { IM_PIX_SET(dest_b, i/width, i%width,0); } } gif_write_file(dest_b,"Med_3sigma_b.gif"); printf("done\n");}*/static void tv_choice_proc(choice)
int choice;
{
switch (choice)
{
case 0: tv_set_next(tv);
break;
case 1: tv_set_next(tv1);
break;
default:error("tv_choice_proc: unknown choice\n", warning);
break;
}}static void scan_proc(void){ scan_files(directory_name,file_name); tw_sglobal_reset(pdir); tw_sglobal_reset(pfile);}/********** Tool creation **********/
void denoise_3sigma_tool(int x, int y)
{
static void *tool = NULL; if (tool)
{
tw_show_tool(tool);
return;
}
tool = (void *)tw_tool("Image 3sigma denoise", x, y);
/* Initialise pathname from environment variable (or #define) */ (void) environ_pathname_get(directory_name, file_name, "TINA_IMAGE_DEFAULT", "/home/wzz/newimscramdegree/result/Lena.bmp");
//tw_button("3sigma",denoise_3sigma_proc,NULL); tw_newrow(); /*---------------------------*/ pdir = (void *) tw_sglobal("Directory:", directory_name, 32); tw_button("scan", scan_proc, NULL); tw_newrow(); pfile = (void*) tw_sglobal("File:", file_name, 32); tw_newrow(); /*---------------------------*/ tw_button("Ave_Var",Get_ave_var_proc); tw_button("Gauss",Gauss_proc); //tw_button("FFT",FFT_proc); tw_newrow(); tw_button("Motion",Motion_proc); //tw_button("Ave_3sigma",Ave_3sigma_proc); //tw_button("Med_3sigma",Med_3sigma_proc); tw_newrow();
tw_end_tool();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -