//------------------------------------------------------ // Prog : IFT6150_FinalA25_Prog.c // Auteur : Max Mignotte // Date : Dec. 2025 // langage : C // labo : DIRO // Notes : Pour Compiler: gcc -o IFT6150_A25_Final_Prog IFT6150_A25_Final_Prog.c -lm -lX11 // lena en 512x512 peut etre telecharge en // https://www-labs.iro.umontreal.ca/~mignotte/IFT3205/ProgTpIFT3205/ProgTpIFT3205_Debruitage/lena512.pgm // Pour executer: // ./IFT6150_A25_Final_Prog lenna512 -n 30 -b 30 //------------------------------------------------------ //Pour Compiler: //gcc -o IFT6150_A25_Final_Prog IFT6150_A25_Final_Prog.c -lm -lX11 //------------------------------------------------ // INCLUDED FILES ------------------------------- //------------------------------------------------ #include #include #include #include //------------------------------------------------ // DEFINITIONS ----------------------------------- //------------------------------------------------ #define SIGMA_NOISE 30.0 #define BETA 250.0 #define PI 3.1415926535897 #define GREY_LEVEL 255 #define NBCHAR 200 #define CARRE(X) ((X)*(X)) #define NAME_VISUALISER "display " #define NAME_IMG_IN "lena512" #define NAME_IMG_OUT "lena512_Restored" #define NAME_IMG_DEG "lena512_Degraded" //------------------------------------------------ // CONSTANTS ------------------------------------- //------------------------------------------------ const int ZOOM=1; const int QUIT=0; //------------------------------------------------ // GLOBAL VARIABLES ------------------------------ //------------------------------------------------ char Name_img[100]; int flag_save; int flag_quit; int zoom; int length,width; float SigmaNoise; float Beta; //------------------------- //--- WINDOWS ------------- //------------------------- #include Display *display; int screen_num; int depth; Window root; Visual* visual; GC gc; //-------------------------------------------------- // OPEN_DISPLAY() //-------------------------------------------------- int open_display() { if ((display=XOpenDisplay(NULL))==NULL) { printf("Connection impossible\n"); return(-1); } else { screen_num=DefaultScreen(display); visual=DefaultVisual(display,screen_num); depth=DefaultDepth(display,screen_num); root=RootWindow(display,screen_num); return 0; } } //-------------------------------------------------- // FABRIQUE_WINDOW() // create a Window and print it to screen //-------------------------------------------------- Window fabrique_window(char *nom_fen,int x,int y,int width,int height,int zoom) { Window win; XSizeHints size_hints; XWMHints wm_hints; XClassHint class_hints; XTextProperty windowName, iconName; char *name=nom_fen; if(zoom<0) { width/=-zoom; height/=-zoom; } if(zoom>0) { width*=zoom; height*=zoom; } win=XCreateSimpleWindow(display,root,x,y,width,height,1,0,255); size_hints.flags=PPosition|PSize|PMinSize; size_hints.min_width=width; size_hints.min_height=height; XStringListToTextProperty(&name,1,&windowName); XStringListToTextProperty(&name,1,&iconName); wm_hints.initial_state=NormalState; wm_hints.input=True; wm_hints.flags=StateHint|InputHint; class_hints.res_name=nom_fen; class_hints.res_class=nom_fen; XSetWMProperties(display,win,&windowName,&iconName, NULL,0,&size_hints,&wm_hints,&class_hints); gc=XCreateGC(display,win,0,NULL); XSelectInput(display,win,ExposureMask|KeyPressMask|ButtonPressMask| ButtonReleaseMask|ButtonMotionMask|PointerMotionHintMask| StructureNotifyMask); XMapWindow(display,win); return(win); } //-------------------------------------------------- // CREE_XIMAGE() // Create a XImage from a float** //-------------------------------------------------- XImage* cree_Ximage(float** mat,int z,int length,int width) { int lgth,wdth,lig,col,zoom_col,zoom_lig; float somme; unsigned char pix; unsigned char* dat; XImage* imageX; //Zoom positiv if (z>0) { lgth=length*z; wdth=width*z; dat=(unsigned char*)malloc(lgth*(wdth*4)*sizeof(unsigned char)); if (dat==NULL) { printf("Memory Allocation Error"); exit(-1); } for(lig=0;lig (into pgm) //---------------------------------------------------------- float** LoadImagePgm(char* name,int *length,int *width) { int i,j; unsigned char var; char buff[NBCHAR]; int tmp; char* ptmp; float** mat; char stringTmp1[NBCHAR],stringTmp2[NBCHAR]; int ta1,ta2,ta3; FILE *fic; //FileName strcpy(buff,name); strcat(buff,".pgm"); printf(" -> Ouverture de [%s]",buff); //OpenFile fic=fopen(buff,"r"); if (fic==NULL) { printf("\n- Grave erreur a l'ouverture de %s -\n",buff); exit(-1); } //Load Header ptmp=fgets(stringTmp1,100,fic); ptmp=fgets(stringTmp2,100,fic); tmp=fscanf(fic,"%d %d",&ta1,&ta2); tmp=fscanf(fic,"%d\n",&ta3); //Print Header printf("\n Header:"); printf("\n %s %s %d %d \n %d\n",stringTmp1,stringTmp2,ta1,ta2,ta3); *length=ta1; *width=ta2; mat=fmatrix_allocate_2d(*length,*width); //Loading for(i=0;i<*length;i++) for(j=0;j<*width;j++) { tmp=fread(&var,1,1,fic); mat[i][j]=var; } //Close File if ((tmp)||(ptmp)) {;} fclose(fic); return(mat); } //---------------------------------------------------------- // Sauvegarde de l'image de nom au format pgm //---------------------------------------------------------- void SaveImagePgm(char* name,float** mat,int length,int width) { int i,j; char buff[NBCHAR]; FILE* fic; time_t tm; //Extension strcpy(buff,name); strcat(buff,".pgm"); //Open File fic=fopen(buff,"w"); if (fic==NULL) { printf(" Probleme dans la sauvegarde de %s",buff); exit(-1); } printf("\n Sauvegarde de %s au format pgm",name); //Header Recording fprintf(fic,"P5"); fprintf(fic,"\n# IMG Module"); fprintf(fic,"\n %d %d",width,length); fprintf(fic,"\n255\n"); //Recording for(i=0;iGREY_LEVEL) noise=GREY_LEVEL; if (noise<0) noise=0; return noise; } //---------------------------------------------------------- // funcgauss //---------------------------------------------------------- float funcgauss(float pix,float moy,float var) { return exp(-CARRE(pix-moy)/(2*var))/sqrt(2*PI*var); } //---------------------------------------------------------- // Add Gaussian noise //---------------------------------------------------------- void add_gaussian_noise(float** mat,int lgth,int wdth,float var) { int i,j; //Loop for(i=0;i255) l_end=255; //for(l=l_begin;l<=l_end;l++) //-- for(l=0;l<=255;l++) { NrjTotVar=0.0; NrjTotVar+=fabs(MatR[i-1][j]-(float)l); NrjTotVar+=fabs(MatR[i-1][j-1]-(float)l); NrjTotVar+=fabs(MatR[i][j-1]-(float)l); NrjTotVar+=fabs(MatR[i+1][j-1]-(float)l); NrjTotVar+=fabs(MatR[i+1][j]-(float)l); NrjTotVar+=fabs(MatR[i+1][j+1]-(float)l); NrjTotVar+=fabs(MatR[i][j+1]-(float)l); NrjTotVar+=fabs(MatR[i-1][j+1]-(float)l); //VctNrj[l]=-log(funcgauss(l,MatImg[i][j],CARRE(SigmaNoise)))+Beta*NrjTotVar; VctNrj[l]=CARRE(l-MatImg[i][j])+Beta*NrjTotVar; } NrjMin=100000; LabelNrjMin=-1; for(l=0;l<255;l++) { if (VctNrj[l] -n 30 -b 30",argv[0]); printf("\n %s -n 20 -b 30",argv[0]); printf("\n %s -n 10 -b 30",argv[0]); printf("\n\n\n\n"); exit(-1); } //Load File Image strcpy(Name_img,argv[1]); //Loop for(i=2;iReadImage_&_AllocateMemory_&_Degradation float** Img=LoadImagePgm((char*)argv[1],&length,&width); float** ImgDegrad=fmatrix_allocate_2d(length,width); float** ImgDenoised=fmatrix_allocate_2d(length,width); Zero(ImgDenoised,length,width); copy_matrix(ImgDegrad,Img,length,width); add_gaussian_noise(ImgDegrad,length,width,CARRE(SigmaNoise)); printf("\n Info Noise:"); printf(" MSE = %.2f",ComputeMMSE(ImgDegrad,Img,length)); //========================================================= //== PROG : TV denoising ================================== //========================================================= if ((1)) { MMSE_(Img,ImgDegrad,length,width); EstimateTotVarGaussMap(ImgDegrad,ImgDenoised,length,width,SigmaNoise,Beta); MMSE_(Img,ImgDenoised,length,width); } //-------------------------------- ------------- // SAUVEGARDE: ImgDegraded & ImgFiltered //---------------------------------------------- if (flag_save) SaveImagePgm(NAME_IMG_DEG,ImgDegrad,length,width); if (flag_save) SaveImagePgm(NAME_IMG_OUT,ImgDenoised,length,width); //========================================================= //== PROG : Choose Labels ================================= //========================================================= long int l; int NbEch; float Prop0,Prop1,Prop2; float* prob=fmatrix_allocate_1d(3); prob[0]=0.2; prob[1]=0.7; prob[2]=0.1; NbEch=1000000; printf("\n\n Testons maintenant le programme choose_label.\n"); printf(" Pour cela tirons %d échantillons par cette fonction avec les probabilités trinomiales [0.2 : 0.7 : 0.1]\n",NbEch); printf(" et vérifions que les proportions empiriques des tirages des étiquette de classe sont bien respectées\n"); Prop0=Prop1=Prop2=0.0; for(k=0;kwidth,x_ppicture->height); XPutImage(display,win_ppicture_Degrad,gc,x_ppicture_Degrad,0,0,0,0, x_ppicture_Degrad->width,x_ppicture_Degrad->height); XPutImage(display,win_ppicture_Denoised,gc,x_ppicture_Denoised,0,0,0,0, x_ppicture_Denoised->width,x_ppicture_Denoised->height); break; case KeyPress: XDestroyImage(x_ppicture); XDestroyImage(x_ppicture_Degrad); XDestroyImage(x_ppicture_Denoised); XFreeGC(display,gc); XCloseDisplay(display); flag=1; break; } if (flag==1) break; } } //-------- End Graphical Session -------------------- //--------------------------------------------------- //Free memory if (Img) free_fmatrix_2d(Img); if (ImgDegrad) free_fmatrix_2d(ImgDegrad); if (ImgDenoised) free_fmatrix_2d(ImgDenoised); //Return printf("\n\n That's all Folks... \n\n"); return 0; }