yoyo30 | Code :
- /* Inclusions des bibliothèques contenant les prototypes des fonctions standard de C */
- #include <stdio.h>
- #include <stdlib.h>
- /* Définition de constantes globales */
- #define MOT 2 /* nombre d'octet dans un mot */
- /* Définition des prototypes des fonctions ou sous-programmes codés par l'utilisateur : informe le compilateur de la syntaxe attendue pour ce sous-programme */
- void lecture_ecriture_image(short int *image, int cote, char *nom1, char *nom2, int option);
- /* si option vaut 0, lit sur le disque l'image dicom nommée nom1 puis stocke en mémoire les cote² valeurs des pixels à partir du pointeur image*/
- /* si option vaut 1, écrit sur le disque une image dicom nommée nom2 contenant l'entete du fichier nom1 puis les cote² valeurs des pixels stockés à partir du pointeur image */
- void message(char *information); /* renvoie à l'écran un message */
- /*---------------------------------------------------------------------------------------------------------------------------------------------*/
- /* Programme principal */
- /*---------------------------------------------------------------------------------------------------------------------------------------------*/
- int main() /* Programme principal */
- {
- int i,j,ki, kj; /* variable entières signées: indices de boucles */
- int cote; /* taille de l'image en pixels par cote */
- char nom[256], nom1[256], nom2[256]; /* chaines de caractères via pointeurs sur les noms des fichiers images lus sans entete, avec entete dicom et écrits en sortie */
- char information[2048]; /* message à afficher a l'utilisateur */
- short int *image;
- short int *image2 ; /* pointeur sur les valeurs de pixels contenues dans le fichier image dicom, sur 2 octets */
- short int *tampon ; /* pointeur sur les pixels de l'image en cours de filtrage, codes sur 1 mot */
- /**************************************************************************************************************************************************/
- float coef[3][3]={1.,2.,1.,2.,4.,2.,1.,2.,1.} ; /* pondérations pour le lissage */
- float somme, calcul;
- /* Calcul de la somme des coefficients pour moyenne */
- somme = 0.0;
- for(i=0;i<3;i++) for(j=0;j<3;j++) somme += coef[i][j];
- /**************************************************************************************************************************************************/
- /* Ouverture du fichier contenant l’image */
-
- printf("\nEntrez le nom du fichier image dicom a ouvrir : " ); /* affiche un texte à l'écran, pour information */
- scanf("%s",nom); /* affecte la chaine de caractères tapée au pointeur nom */
- sprintf(nom1,"%s.dcm",nom); /* concatène nom et .dcm dans nom1*/
- printf("\nEntrez la taille de cette image (nombre de pixels par cote) : " );
- scanf("%d",&cote); /* affecte le nombre entier entré à l'adresse pointée par &cote*/
- /* Affectation de la mémoire vive nécessaire au stockage des pixels de l'image */
-
- image = malloc(cote*cote*sizeof(short int)) ; /* Allocation de taille_dicom mots de 2 octets à partir de *dicom */
- if(image==NULL)
- {
- sprintf(information, "Erreur : Allocation du fichier dicom impossible lors de sa lecture\n" );
- message(information);
- }
-
-
- /* Lecture de l'image dicom sur le disque dur et affectation des valeurs des pixels au pointeur image */
-
- lecture_ecriture_image(image,cote,nom1,nom1,0);
- /* Filtrage de l’image */
- tampon = malloc(cote*cote*sizeof(short int)) ; /* Allocation de cote² mots de 2 octets à partir de *tampon */
- if(tampon==NULL)
- {
- sprintf(information, "Erreur : Allocation de l'image tampon impossible lors du filtrage\n" );
- message(information);
- }
-
- for(i=1; i<cote-1; i++) for(j=1; j<cote-1; j++)
- {
- *(tampon+j+i*cote) = 0;
-
- /**************************************************************************************************************************************************/
-
- calcul = 0.0;
-
- for(ki=-1;ki<=1;ki++)
- for(kj=-1;kj<=1;kj++)
- calcul += (coef[ki+1][kj+1] * (float)(*(image + j+kj + (i+ki)*cote))) ; /* Filtrage linéaire */
-
- *(tampon+j+i*cote) = (short int)( calcul/somme + 0.5); /* moyenne arrondie au plus près*/
-
- /**************************************************************************************************************************************************/
- }
-
- for(i=1; i<cote-1; i++) for(j=1; j<cote-1; j++) *(image +j+i*cote) = *(tampon+j+i*cote); /* recopie en ecrasant l'ancienne image */
- free(tampon);
- /* Ecriture sur le disque d'une image dicom contenant l'entete du fichier nom1 puis les cote² valeurs des pixels stockés à partir du pointeur image sur 2 octets */
-
- sprintf(nom2,"%s-filtre.dcm",nom); /* nom du fichier en sortie */
- lecture_ecriture_image(image,cote,nom1,nom2,1);
- /* libération de mémoire */
- free(image);
-
- sprintf(information,"\nLe fichier %s a ete ecrit dans le repertoire courant avec succes.\nFin du programme (tapez sur une touche pour fermer)\n",nom2);
- message(information);
- }
- /*---------------------------------------------------------------------------------------------------------------------------------------------*/
- /*---------------------------------------------------------------------------------------------------------------------------------------------*/
- /* A partir d'ici, nous définissons les fonctions et programmes utilisées dans le programme princupal */
- /*---------------------------------------------------------------------------------------------------------------------------------------------*/
- /*---------------------------------------------------------------------------------------------------------------------------------------------*/
- void lecture_ecriture_image(short int *image, int cote, char *nom1, char *nom2, int option)
- /* Cette fonction est utilisée pour lire les pixels d'une image dicom et pour y écrire des valeurs de pixels modifiés */
- /* image est un pointeur en mémoire à partir duquel sont stockés les cote² valeurs des pixels; cote est le nombre de pixels par ligne et par colonne d'une image carrée */
- /* nom1 est le nom du fichier dicom à lire sur le disque (option 0) ou celui dont on utilisera l'entete pour écrire un fichier dicom nom2 filtré (option 1) */
- /* en d'autres termes : */
- /* si option vaut 0, lit sur le disque l'image dicom nommée nom1 puis stocke en mémoire les cote² valeurs des pixels à partir du pointeur image*/
- /* si option vaut 1, écrit sur le disque une image dicom nommée nom2 contenant l'entete du fichier nom1 puis les cote² valeurs des pixels stockés à partir du pointeur image */
- {
- FILE *fichier ; /* structure identifiant un fichier */
- short int *dicom ; /* pointeur sur le fichier image dicom complet, avec ses entetes, sur 2 octets : ces données ne seront connues que dans cette fonction*/
- int taille; /* taille du fichier image dicom */
- int entete; /* entier contenant le nombre de mots dans l'entete dicom */
- int i,j; /* entiers servant à balayer les pixels de l'image suivant lignes et colonnes */
- char information[2048]; /* message à afficher a l'utilisateur */
-
- /* Définition d'un pointeur sur le fichier présent dans le disque dur */
-
- fichier=fopen(nom1,"rb" ) ; /* ouvre le fichier nom1 sur le disque en lecture */
- if(fichier==NULL) /* avertissement et sortie en cas de lecture impossible */
- {
- sprintf(information, "Erreur : le fichier %s n'est pas lisible dans le repertoire courant\n",nom1); /* fabrique la chaine de caractères "message" */
- message(information); /* appel à la fonction qui affiche le message */
- }
-
- /* Calcul de la taille du fichier dicom contenant l'image */
-
- fseek(fichier,0,SEEK_END); /* Déplacement du pointeur du fichier en fin de fichier */
- taille = ftell(fichier); /* La fonction ftell renvoie la position courante en octet du pointeur de fichier */
- /* par rapport au début du fichier, donc ici la taille du fichier */
- taille/=MOT; /* calcul de la taille du fichier dicom en mots de 2 octets */
-
- /* Calcul de la taille de l'entête unique en début de fichier */
- entete = taille - cote*cote; /* calcul de la taille de l'entête du fichier dicom en mots de 2 octets */
-
- /* Allocation d’un pointeur sur le fichier image dicom complet */
- dicom = malloc(taille*sizeof(short int)) ; /* Allocation locale de taille_dicom mots de 2 octets à partir de *dicom */
- if(dicom==NULL)
- {
- sprintf(information, "Erreur : Allocation du fichier dicom impossible lors de sa lecture\n" );
- message(information);
- }
- fseek(fichier,0,SEEK_SET); /* rembobinage */
- fread(dicom,taille,sizeof(short int),fichier) ; /* affectation de la mémoire vive allouée par lecture de nom1 */
- fclose(fichier) ; /* libération du pointeur de fichier */
- /* Lecture ou écriture, suivant la valeur de l'option */
- if(option==0) for(i=0;i<cote;i++) for(j=0;j<cote;j++) *(image+j+i*cote) = *(dicom + entete +j + i*cote);
- /* Si option=0, affectation du pointeur image aux valeurs des pixels situés après l'entete */
- else /* si option=1*/
- {
- /* Dans le pointeur dicom, on conserve l'entete et on écrase les valeurs des pixels situées après l'entete avec les pixels filtrés pointés par image */
- for(i=0;i<cote;i++) for(j=0;j<cote;j++) *(dicom+entete+j+i*cote) = *(image +j + i*cote);
-
- /* puis on écrit sur le disque dur le nouveau fichier dicom produit */
- fichier=fopen(nom2,"wb" ) ; /* pointeur sur le fichier à écrire sur le disque */
- if(fichier==NULL)
- {
- sprintf(information,"Erreur : le fichier %s ne peut pas etre ecrit dans le répertoire courant\n",nom2);
- message(information);
- }
- fseek(fichier,-0,SEEK_SET); /* positionnement en début de fichier */
- fwrite(dicom,taille,sizeof(short int),fichier) ; /* écriture du pointeur dans le fichier nom2 */
- fclose(fichier) ; /* libération du pointeur de fichier */
- }
-
- }
- /*---------------------------------------------------------------------------------------------------------------------------------------------*/
- /*---------------------------------------------------------------------------------------------------------------------------------------------*/
- void message(char *information)
- {
- printf(information); /* affiche à l'écran le message d'information */
- getch(); /* attente d'une frappe clavier pour que l'utilisateur prenne connaissance du probleme */
- exit(1) ; /* sort du programme */
- }
- /*---------------------------------------------------------------------------------------------------------------------------------------------*/
|
Voila mon code sauf que pour le moment j'effectue un filtrage sur une image (ici une image dicom) je compte suprimé ce bout de code et à la place arriver a redimensionner mon image dans ce code : a partir de la console j'insere une image dicom avec ça taille et il me recrée un fichier "filtré" |