Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include "BmpLib.h"
- #include <String.h>
- #include <math.h>
- #define debug true
- void donneesImageRGB2ImageTableau(unsigned char **imageDest, const DonneesImageRGB *imageSource) {
- if (debug) printf("[DEBUG] Debut de la copie de l'image RGB en niv de gris \n");
- int i,j;
- for (i=0; i<imageSource->hauteurImage; i++)
- for (j=0; j<imageSource->largeurImage; j++)
- {
- imageDest[i][j] = imageSource->donneesRGB[(i*imageSource->largeurImage + j)*3 + 1];
- }
- if (debug) printf("[DEBUG] Fin de la copie de l'image RGB en niv de gris \n");
- }
- void imageTableau2ImageRGB(unsigned char **imageSource, DonneesImageRGB *imageDest) {
- if (debug) printf("[DEBUG] Debut de la copie de l'image en niv de gris vers image RGB \n");
- int i,j;
- for (i=0; i<imageDest->hauteurImage; i++)
- for (j=0; j<imageDest->largeurImage; j++)
- {
- imageDest->donneesRGB[(i*imageDest->largeurImage + j)*3] = imageSource[i][j];
- imageDest->donneesRGB[(i*imageDest->largeurImage + j)*3 + 1] = imageSource[i][j];
- imageDest->donneesRGB[(i*imageDest->largeurImage + j)*3 + 2] = imageSource[i][j];
- }
- if (debug) printf("[DEBUG] Fin de la copie du tableau en niv de gris vers image RGB \n");
- }
- void afficherImageTableau(unsigned char **image, const DonneesImageRGB *imageSource) {
- if (debug) printf("[DEBUG] Debut de l'affichage de l'image en niv de gris \n");
- int i, j;
- for (i=0; i<imageSource->hauteurImage; i++)
- for (j=0; j<imageSource->largeurImage; j++)
- {
- if (debug) printf("[DEBUG] [%d][%d] = %d\n", i, j, image[i][j]);
- }
- if (debug) printf("[DEBUG] Fin de l'affichage de l'image en niv de gris \n");
- }
- void calculHistogramme(unsigned char **image, int largeur, int hauteur, int *histoEntier, float *histoFloat) {
- if (debug) printf("[DEBUG] Debut du calcul de l'histogramme\n");
- int i,j;
- /* Initialisation du tableau d'histogramme */
- for(i=0; i<256; i++)
- {
- histoEntier[i] = 0;
- histoFloat[i] = 0.0f;
- }
- /* Calcul des histogrammes */
- for (i=0; i<hauteur; i++)
- for(j=0; j<largeur; j++)
- {
- histoEntier[image[i][j]]++;
- histoFloat[image[i][j]]++;
- }
- /* Calcul pour l'histogramme en flottant */
- for (i=0; i<256; i++)
- histoFloat[i] /= largeur*hauteur;
- if (debug) printf("[DEBUG] Fin du calcul de l'histogramme\n");
- }
- void afficheHistogramme(int *histoEntier, float *histoFloat)
- {
- if (debug) printf("[DEBUG] Debut de l'affichage de l'histogramme\n");
- int i;
- for (i=0; i<256; i++)
- if (debug) printf("[DEBUG] H[%d] = %d \t|\tH[%d] = %f\n", i, histoEntier[i], i, histoFloat[i]);
- if (debug) printf("[DEBUG] Fin de l'affichage de l'histogramme\n");
- }
- unsigned char** seuillageAutomatiqueEntropie(unsigned char **image2D, DonneesImageRGB *image, float *histoFloat, int *histoEntier, int *seuilEntropieMax) {
- if (debug) printf("[DEBUG] Debut du seuillage automatique par maximisation de l'entropie\n");
- int s,p;
- double h;
- double h2;
- double hMax = 0.0;
- int nc;
- unsigned char **imageDest = (unsigned char **)malloc(image->hauteurImage*sizeof(unsigned char *));
- for (s=0; s<image->hauteurImage; s++)
- imageDest[s] = (unsigned char *)malloc(image->largeurImage*sizeof(unsigned char));
- for (s=0; s<255; s++)
- {
- h = 0.0f;
- h2 = 0.0f;
- nc = 0;
- for(p=0; p<s; p++)
- {
- if (histoFloat[p] > 0) h += histoFloat[p] * log(histoFloat[p]);
- nc += histoEntier[p];
- }
- if (nc > 0) h *= -1/nc;
- for(p=s+1; p<255; p++)
- {
- if (histoFloat[p] > 0) h2 += histoFloat[p] * log(histoFloat[p]);
- }
- h2 *= -1/(image->largeurImage*image->hauteurImage - nc);
- //Apparement faut pas faire le dernier calcul
- h += h2 + log(nc * (image->largeurImage*image->hauteurImage - nc));
- if (h > hMax)
- {
- hMax = h;
- *seuilEntropieMax = s;
- }
- }
- if (debug) printf("[DEBUG] hMax: %f | sMax: %i\n", hMax, *seuilEntropieMax);
- /* Maintenant qu'on a la valeur de s qui maximise l'entropie */
- /* Tous les pixels dont le niveau de gris est inferieur a s deviennent noir */
- /* Les autres deviennent blanc */
- for (s=0; s<image->hauteurImage; s++)
- for(p=0; p<image->largeurImage; p++)
- {
- if (image2D[s][p] < *seuilEntropieMax) imageDest[s][p] = 0;
- else imageDest[s][p] = 255;
- }
- if (debug) printf("[DEBUG] Fin du seuillage automatique par maximisation de l'entropie\n");
- return imageDest;
- }
- unsigned char** convolution(unsigned char **image2D, DonneesImageRGB *image, int **masque, int taille)
- {
- if (debug) printf("[DEBUG] Debut de convolution\n");
- int i,j,k,l,val,div;
- unsigned char **imageDest = (unsigned char **)malloc(image->hauteurImage*sizeof(unsigned char *));
- for (i=0; i<image->hauteurImage; i++)
- imageDest[i] = (unsigned char *)malloc(image->largeurImage*sizeof(unsigned char));
- /* Calcul de la somme des coefficients du masque */
- div = 0;
- for(k=-taille/2; k<=taille/2; k++)
- for(l=-taille/2; l<=taille/2; l++)
- {
- div += (int)masque[k+taille/2][l+taille/2];
- }
- /* Convolution de image2D par masque */
- /* sauvegarde du resultat dans imageDest */
- for (i=taille/2; i<image->hauteurImage-taille/2; i++)
- for(j=taille/2; j<image->largeurImage-taille/2; j++)
- {
- val = 0;
- for(k=-taille/2; k<=taille/2; k++)
- for(l=-taille/2; l<=taille/2; l++)
- val += masque[k+taille/2][l+taille/2]*image2D[i+k][j+l];
- if (div != 0) val /= div;
- if (val > 255) imageDest[i][j] = 255;
- else if (val < 0) imageDest[i][j] = 0;
- else imageDest[i][j] = val;
- }
- if (debug) printf("[DEBUG] Fin de convolution\n");
- return imageDest;
- }
- /*
- Crée le masque moyenneur de la taille spécifiée
- */
- void creerMasqueMoyenneur(int **masque, int taille) {
- int i,j;
- for (i=0; i<taille; i++)
- for (j=0; j<taille; j++)
- masque[i][j] = 1;
- }
- /*
- Crée le masque gaussien 3x3 ou 5x5
- */
- void creerMasqueGaussien(int **masque, int taille) {
- if (taille == 3)
- {
- masque[0][0] = 1;
- masque[0][1] = 2;
- masque[0][2] = 1;
- masque[1][0] = 2;
- masque[1][1] = 4;
- masque[1][2] = 2;
- masque[2][0] = 1;
- masque[2][1] = 2;
- masque[2][2] = 1;
- }
- if (taille == 5)
- {
- masque[0][0] = 1;
- masque[0][1] = 4;
- masque[0][2] = 6;
- masque[0][3] = 4;
- masque[0][4] = 1;
- masque[1][0] = 4;
- masque[1][1] = 16;
- masque[1][2] = 24;
- masque[1][3] = 16;
- masque[1][4] = 4;
- masque[2][0] = 6;
- masque[2][1] = 24;
- masque[2][2] = 36;
- masque[2][3] = 24;
- masque[2][4] = 6;
- masque[3][0] = 4;
- masque[3][1] = 16;
- masque[3][2] = 24;
- masque[3][3] = 16;
- masque[3][4] = 4;
- masque[4][0] = 1;
- masque[4][1] = 4;
- masque[4][2] = 6;
- masque[4][3] = 4;
- masque[4][4] = 1;
- }
- }
- /*
- Crée le masque laplacien 4 ou 8
- */
- void creerMasqueLaplacien(int **masque, int taille) {
- if (taille == 4)
- {
- masque[0][0] = 0;
- masque[0][1] = -1;
- masque[0][2] = 0;
- masque[1][0] = -1;
- masque[1][1] = 4;
- masque[1][2] = -1;
- masque[2][0] = 0;
- masque[2][1] = -1;
- masque[2][2] = 0;
- }
- if (taille == 8)
- {
- masque[0][0] = -1;
- masque[0][1] = -1;
- masque[0][2] = -1;
- masque[1][0] = -1;
- masque[1][1] = 8;
- masque[1][2] = -1;
- masque[2][0] = -1;
- masque[2][1] = -1;
- masque[2][2] = -1;
- }
- }
- /*
- Crée le masque de la taille spécifiée
- et le renvoie.
- */
- int** creerMasque(int taille) {
- int i,j;
- int **masque = (int**)malloc(taille*sizeof(int*));
- for (i=0; i<taille; i++)
- masque[i] = (int*)malloc(taille*sizeof(int));
- for (i=0; i<taille; i++)
- for(j=0; j<taille; j++)
- {
- printf("MASQUE[%d][%d] = ",i,j);
- scanf(" %d", &masque[i][j]);
- }
- return masque;
- }
- /*
- Retourne l'image en niveau de gris après application du gradient de Roberts.
- */
- unsigned char** gradientRoberts(unsigned char ** image2D, DonneesImageRGB* image)
- {
- if (debug) printf("[DEBUG] Debut du filtrage par le gradient de Roberts\n");
- int i,j;
- int gx,gy;
- unsigned char **imageDest = (unsigned char **)malloc(image->hauteurImage*sizeof(unsigned char *));
- for (i=0; i<image->hauteurImage; i++)
- imageDest[i] = (unsigned char *)malloc(image->largeurImage*sizeof(unsigned char));
- for(i=0; i<image->hauteurImage-1; i++)
- for(j=0; j<image->largeurImage-1; j++)
- {
- gx = image2D[i][j+1] - image2D[i][j];
- gy = image2D[i+1][j] - image2D[i][j];
- imageDest[i][j] = sqrt((float)gx*gx + (float)gy*gy);
- }
- if (debug) printf("[DEBUG] Fin du filtrage par le gradient de Roberts\n");
- return imageDest;
- }
- /*
- Retourne l'image en niveau de gris après application du gradient de Prewitt.
- */
- unsigned char** gradientPrewitt(unsigned char ** image2D, DonneesImageRGB* image)
- {
- if (debug) printf("[DEBUG] Debut du filtrage par le gradient de Prewitt\n");
- int i,j,k,l;
- int gx,gy;
- unsigned char **imageDest = (unsigned char **)malloc(image->hauteurImage*sizeof(unsigned char *));
- for (i=0; i<image->hauteurImage; i++)
- imageDest[i] = (unsigned char *)malloc(image->largeurImage*sizeof(unsigned char));
- /* Masque de Prewitt */
- int masqueX[3][3] = {{-1,0,1},{-1,0,1},{-1,0,1}};
- int masqueY[3][3] = {{-1,-1,-1},{0,0,0},{1,1,1}};
- for (i=1; i<image->hauteurImage-1; i++)
- for(j=1; j<image->largeurImage-1; j++)
- {
- gx = 0;
- gy = 0;
- for(k=-1; k<=1; k++)
- for(l=-1; l<=1; l++)
- {
- gx += masqueX[k+1][l+1]*image2D[i+k][j+l];
- gy += masqueY[k+1][l+1]*image2D[i+k][j+l];
- }
- imageDest[i][j] = sqrt(gx*gx + gy*gy);
- }
- if (debug) printf("[DEBUG] Fin du filtrage par le gradient de Prewitt\n");
- return imageDest;
- }
- /*
- Retourne l'image en niveau de gris après application du gradient de Sobel.
- */
- unsigned char** gradientSobel(unsigned char **image2D, DonneesImageRGB* image)
- {
- if (debug) printf("[DEBUG] Debut du filtrage par le gradient de Sobel\n");
- int i,j,k,l;
- int gx,gy;
- unsigned char **imageDest = (unsigned char **)malloc(image->hauteurImage*sizeof(unsigned char *));
- for (i=0; i<image->hauteurImage; i++)
- imageDest[i] = (unsigned char *)malloc(image->largeurImage*sizeof(unsigned char));
- /* Masque de Sobel */
- int masqueX[3][3] = {{-1,0,1},{-2,0,2},{-1,0,1}};
- int masqueY[3][3] = {{-1,-2,-1},{0,0,0},{1,2,1}};
- /* On parcourt tous les pixels de l'image */
- for (i=1; i<image->hauteurImage-1; i++)
- for(j=1; j<image->largeurImage-1; j++)
- {
- gx = 0;
- gy = 0;
- for(k=-1; k<=1; k++)
- for(l=-1; l<=1; l++)
- {
- gx += masqueX[k+1][l+1]*image2D[i+k][j+l];
- gy += masqueY[k+1][l+1]*image2D[i+k][j+l];
- }
- imageDest[i][j] = sqrt(gx*gx + gy*gy);
- }
- if (debug) printf("[DEBUG] Fin du filtrage par le gradient de Sobel\n");
- return imageDest;
- }
- unsigned char** filtreMedian(unsigned char **image2D, DonneesImageRGB *image, int **masque, int taille)
- {
- if (debug) printf("[DEBUG] Debut du filtrage par le filtre Median\n");
- /* Initialisation */
- int i,j,k,l,cpt = 0, min, indiceMin;
- unsigned char **imageDest = (unsigned char **)malloc(image->hauteurImage*sizeof(unsigned char *));
- for (i=0; i<image->hauteurImage; i++)
- imageDest[i] = (unsigned char *)malloc(image->largeurImage*sizeof(unsigned char));
- /* On compte combien de 1 se trouve dans le masque */
- /* Afin de savoir combien de case contiendra notre tableau à trier */
- for (i=0; i<taille; i++)
- for(j=0; j<taille; j++)
- {
- if (masque[i][j] == 1) cpt++;
- }
- int *tab = (int*)malloc(cpt*sizeof(int));
- /* On parcour l'ensemble de l'image2D */
- /* En chacun de ses pixels, on calcul la valeur médiane des niv de gris contenus dans le masque */
- /* On donne la valeur médiane au pixel */
- for(i=taille/2; i<image->hauteurImage-taille/2; i++)
- for(j=taille/2; j<image->largeurImage-taille/2; j++)
- {
- cpt = 0;
- for(k=-taille/2; k<=taille/2; k++)
- for(l=-taille/2; l<=taille/2; l++)
- {
- if (masque[k+taille/2][l+taille/2] == 1)
- {
- tab[cpt] = image2D[i+k][j+l];
- cpt++;
- }
- }
- /* On tri le tableau */
- for (k=0; k<cpt-1; k++)
- {
- min = tab[k];
- indiceMin = k;
- for(l=k+1; l<cpt; l++)
- {
- if (tab[l] < min)
- {
- min = tab[l];
- indiceMin = l;
- }
- }
- tab[indiceMin] = tab[k];
- tab[k] = min;
- }
- /* On prend la valeur médiane et on la met dans imageDest[i][j] */
- imageDest[i][j] = tab[cpt/2];
- }
- if (debug) printf("[DEBUG] Fin du filtrage par le filtre median\n");
- return imageDest;
- }
- /*
- Retourne l'image dilatée en niveau de gris.
- On recherche pour chaque pixel, le pixel maximum présent dans son voisinage
- On sauvegarde ce maximum dans l'image destinataire.
- */
- unsigned char** dilatation(unsigned char** image2D, DonneesImageRGB* image, int** masque, int taille)
- {
- if (debug) printf("[DEBUG] Debut de la dilatation\n");
- int i,j,k,l,sup;
- unsigned char **imageDest = (unsigned char **)malloc(image->hauteurImage*sizeof(unsigned char *));
- for (i=0; i<image->hauteurImage; i++)
- imageDest[i] = (unsigned char *)malloc(image->largeurImage*sizeof(unsigned char));
- for(i=taille/2; i<image->hauteurImage-taille/2; i++)
- for(j=taille/2; j<image->largeurImage-taille/2; j++)
- {
- sup = image2D[i][j];
- for(k=-taille/2; k<=taille/2; k++)
- for(l=-taille/2; l<=taille/2; l++)
- {
- if (image2D[i+k][j+l] > sup && masque[k+taille/2][l+taille/2] == 1) sup = image2D[i+k][j+l];
- }
- imageDest[i][j] = sup;
- }
- if (debug) printf("[DEBUG] Fin de la dilatation\n");
- return imageDest;
- }
- /*
- Retourne l'image erodée en niveau de gris.
- Pour chaque pixel, on recherche le pixel de valeur minimum présent dans son voisinage
- On sauvegarde ce minimum dans l'image destinataire.
- */
- unsigned char** erosion(unsigned char** image2D, DonneesImageRGB* image, int** masque, int taille)
- {
- if (debug) printf("[DEBUG] Debut de l'erosion\n");
- int i,j,k,l,inf;
- unsigned char **imageDest = (unsigned char **)malloc(image->hauteurImage*sizeof(unsigned char *));
- for (i=0; i<image->hauteurImage; i++)
- imageDest[i] = (unsigned char *)malloc(image->largeurImage*sizeof(unsigned char));
- for(i=taille/2; i<image->hauteurImage-taille/2; i++)
- for(j=taille/2; j<image->largeurImage-taille/2; j++)
- {
- inf = image2D[i][j];
- for(k=-taille/2; k<=taille/2; k++)
- for(l=-taille/2; l<=taille/2; l++)
- {
- if (image2D[i+k][j+l] < inf && masque[k+taille/2][l+taille/2] == 1) inf = image2D[i+k][j+l];
- }
- imageDest[i][j] = inf;
- }
- if (debug) printf("[DEBUG] Fin de l'erosion\n");
- return imageDest;
- }
- /*
- Retourne l'image difference entre imageDest1 et imageDest2 en niveau de gris.
- Pour chaque pixel, on effectue la soustraction entre imageDest1 et imageDest2.
- Si la difference est négative, on met le pixel à 0.
- */
- unsigned char** difference(unsigned char **imageDest1, unsigned char **imageDest2, DonneesImageRGB *image)
- {
- if (debug) printf("[DEBUG] Debut de la difference\n");
- int i,j;
- unsigned char **imageDest = (unsigned char **)malloc(image->hauteurImage*sizeof(unsigned char *));
- for (i=0; i<image->hauteurImage; i++)
- imageDest[i] = (unsigned char *)malloc(image->largeurImage*sizeof(unsigned char));
- for (i=0; i<image->hauteurImage; i++)
- for(j=0; j<image->largeurImage; j++)
- {
- if (imageDest1[i][j] < imageDest2[i][j]) imageDest[i][j] = 0;
- else imageDest[i][j] = imageDest1[i][j] - imageDest2[i][j];
- }
- if (debug) printf("[DEBUG] Fin de la difference\n");
- return imageDest;
- }
- /*
- Retourne le perimetre de chaque forme de l'image.
- Parcour l'ensemble de l'image, pour chaque pixel (i,j),
- on regarde si il touche au moins un pixel noir
- si c'est le cas, c'est un pixel du contour, on incrémente le cpt
- */
- int calculPerimetre(unsigned char **imageDest, DonneesImageRGB *image)
- {
- if (debug) printf("[DEBUG] Debut du calcul du perimetre\n");
- int i,j, cpt=0, k, l;
- bool estContour = false;
- for(i=1; i<image->hauteurImage-1; i++)
- for(j=1; j<image->largeurImage-1; j++)
- {
- estContour = false;
- for(k=-1;k<=1;k++)
- for(l=-1;l<=1;l++)
- {
- if (imageDest[i][j] == 255)
- {
- if (imageDest[i+k][j+l] == 0) estContour = true;
- }
- }
- if (estContour) cpt++;
- }
- if (debug) printf("[DEBUG] Fin du calcul du perimetre\n");
- return cpt;
- }
- /*
- Retourne le nombre de pixel blanc correspondant à la surface des formes présentes sur l'image
- */
- int calculSurface(unsigned char **imageDest, DonneesImageRGB *image)
- {
- if (debug) printf("[DEBUG] Debut du calcul de la surface\n");
- int i,j, cpt=0;
- for(i=0; i<image->hauteurImage; i++)
- for(j=0; j<image->largeurImage; j++)
- if (imageDest[i][j] == 255)
- cpt++;
- if (debug) printf("[DEBUG] Fin du calcul de la surface\n");
- return cpt;
- }
- /*
- Retourne la circularite Geometrique suivant le perimetre et la surface passés en parametre
- */
- float circulariteGeometrique(int perimetre, int surface)
- {
- float res = 4*3.1415*(float)surface/((float)perimetre*(float)perimetre);
- return res;
- }
- /*
- Algorithme de Crofton
- P = pi/4*(a*(N0+N90) + a*rac(2)/2*(N45+N135))
- a = distance horizontale entre deux pixels
- */
- float perimetreCrofton(unsigned char **image2D, DonneesImageRGB *image)
- {
- int i,j,k,l,nbPixNoir;
- /* etiquette[0] = N0, etiquette[1] = N45, etiquette[2] = N90, etiquette[3] = N135 */
- int etiquette[4] = {0,0,0,0};
- float crofton = 0.0f;
- unsigned char **imageDest = (unsigned char **)malloc(image->hauteurImage*sizeof(unsigned char *));
- for (i=0; i<image->hauteurImage; i++)
- imageDest[i] = (unsigned char *)malloc(image->largeurImage*sizeof(unsigned char));
- /* On conserve simplement les points du contour */
- for (i=1;i<image->hauteurImage-1;i++)
- for(j=1;j<image->largeurImage-1;j++)
- {
- nbPixNoir = 0;
- if (image2D[i][j] == 255)
- {
- for(k=-1;k<=1;k++)
- for(l=-1;l<=1;l++)
- {
- if (image2D[i+k][j+l] == 0) nbPixNoir++;
- }
- if (nbPixNoir < 2) imageDest[i][j] = 0;
- else imageDest[i][j] = 255;
- }
- }
- /* Recherche de la direction des points */
- for(i=1;i<image->hauteurImage-1;i++)
- for(j=1;j<image->largeurImage-1;j++)
- if (imageDest[i][j] == 255)
- {
- if (imageDest[i][j+1] == 255) etiquette[0]++; //0 degres
- else if (imageDest[i-1][j+1] == 255) etiquette[1]++; //45 degres
- else if (imageDest[i-1][j] == 255) etiquette[2]++; //90 degres
- else if (imageDest[i-1][j-1] == 255) etiquette[3]++; //135 degres
- }
- crofton = 3.1415/4.0*((float)etiquette[0]+(float)etiquette[2] + (sqrt(2)/2.0)*((float)etiquette[1]+(float)etiquette[3]));
- return crofton;
- }
- /*
- Moment cours:
- Crofton -> approximation du périmetre meilleur que par comptage de point
- Surface -> Comptage de point ou comptage de point intérieurs + périmetre
- */
- int main(int argc, char *argv[])
- {
- printf("TRAITEMENT D'IMAGES\n\n");
- DonneesImageRGB *image = (DonneesImageRGB *)malloc(sizeof(DonneesImageRGB));
- char *fichier = (char *)malloc(50*sizeof(char));
- int choixMenu, seuilEntropieMax = 0, i =0, taille = 3;
- int perimetre = 0;
- int surface = 0;
- int *histoEntier = (int *)malloc(256*sizeof(int));
- float *histoFloat = (float *)malloc(256*sizeof(int));
- bool continuer = true;
- int **masque = NULL;
- do{
- printf("Entrez le nom de l'image: ");
- scanf("%49s", fichier);
- image = lisBMPRGB(fichier);
- }while(image == NULL);
- /* Allocation du tableau 2 dimensions contenant l'image en niveau de gris */
- unsigned char **imageDest = NULL;
- unsigned char **imageDest1 = NULL;
- unsigned char **imageDest2 = NULL;
- unsigned char **image2D = (unsigned char **)malloc(image->hauteurImage*sizeof(unsigned char *));
- for (i=0; i<image->hauteurImage; i++)
- image2D[i] = (unsigned char *)malloc(image->largeurImage*sizeof(unsigned char));
- /* Copie des donnéesRGB de image dans le tableau d'unsigned char à 2 dimensions */
- donneesImageRGB2ImageTableau(image2D, image);
- printf("L'image est bien converti en niveau de gris...\n");
- while (continuer) {
- do
- {
- printf("MENU\n");
- printf("1. Afficher le tableau de l'image en niveau de gris\n");
- printf("2. Calculer l'histogramme\n");
- printf("3. Afficher l'histogramme\n");
- printf("4. Seuillage Automatique par Maximisation de l'Entropie\n");
- printf("5. Convolution par un filtre moyenneur\n");
- printf("6. Convolution par un filtre gaussien\n");
- printf("7. Gradient de Roberts\n");
- printf("8. Gradient de Prewitt\n");
- printf("9. Gradient de Sobel\n");
- printf("10. Laplacien (4 ou 8)\n");
- printf("11. Filtre Median\n");
- printf("12. Dilatation\n");
- printf("13. Erosion\n");
- printf("14. Ouverture (Erosion + Dilatation)\n");
- printf("15. Fermeture (Dilatation + Erosion)\n");
- printf("16. Gradient Morphologique (Dilatation - Erosion)\n");
- printf("17. Circularite Geometrique (Comptage de points)\n");
- printf("18. Circularite Geometrique (Crofton)\n");
- printf("19. Sauvegarder l'image\n");
- printf("20. QUITTER\n");
- printf("Choix: ");
- scanf("%d", &choixMenu);
- }while(choixMenu < 1 || choixMenu > 20);
- switch(choixMenu)
- {
- case 1:
- afficherImageTableau(image2D, image);
- break;
- case 2:
- calculHistogramme(image2D, image->largeurImage, image->hauteurImage, histoEntier, histoFloat);
- break;
- case 3:
- afficheHistogramme(histoEntier, histoFloat);
- break;
- case 4:
- imageDest = seuillageAutomatiqueEntropie(image2D, image, histoFloat, histoEntier, &seuilEntropieMax);
- break;
- case 5:
- printf("Entrez la taille du masque: ");
- scanf(" %d", &taille);
- masque = (int**)malloc(taille*sizeof(int*));
- for (i=0; i<taille; i++)
- masque[i] = (int*)malloc(taille*sizeof(int));
- creerMasqueMoyenneur(masque, taille);
- imageDest = convolution(image2D, image, masque, taille);
- break;
- case 6:
- printf("Entrez la taille du masque: ");
- scanf(" %d", &taille);
- masque = (int**)malloc(taille*sizeof(int*));
- for (i=0; i<taille; i++)
- masque[i] = (int*)malloc(taille*sizeof(int));
- creerMasqueGaussien(masque, taille);
- imageDest = convolution(image2D, image, masque, taille);
- break;
- case 7:
- imageDest = gradientRoberts(image2D, image);
- break;
- case 8:
- imageDest = gradientPrewitt(image2D, image);
- break;
- case 9:
- imageDest = gradientSobel(image2D, image);
- break;
- case 10:
- printf("Choix du Laplacien (4 ou 8): ");
- scanf(" %d", &taille);
- masque = (int**)malloc(3*sizeof(int*));
- for (i=0; i<3; i++)
- masque[i] = (int*)malloc(3*sizeof(int));
- creerMasqueLaplacien(masque, taille);
- imageDest = convolution(image2D, image, masque, 3);
- break;
- case 11:
- printf("Entrez la taille du masque: ");
- scanf(" %d", &taille);
- masque = creerMasque(taille);
- imageDest = filtreMedian(image2D, image, masque, taille);
- break;
- case 12:
- printf("Entrez la taille du masque: ");
- scanf(" %d", &taille);
- masque = creerMasque(taille);
- imageDest = dilatation(image2D, image, masque, taille);
- break;
- case 13:
- printf("Entrez la taille du masque: ");
- scanf(" %d", &taille);
- creerMasque(taille);
- imageDest = erosion(image2D, image, masque, taille);
- break;
- case 14:
- printf("Entrez la taille du masque: ");
- scanf(" %d", &taille);
- masque = creerMasque(taille);
- imageDest = erosion(image2D, image, masque, taille);
- imageDest = dilatation(imageDest, image, masque, taille);
- break;
- case 15:
- printf("Entrez la taille du masque: ");
- scanf(" %d", &taille);
- masque = creerMasque(taille);
- imageDest = dilatation(image2D, image, masque, taille);
- imageDest = erosion(imageDest, image, masque, taille);
- break;
- case 16:
- printf("Entrez la taille du masque: ");
- scanf(" %d", &taille);
- masque = creerMasque(taille);
- imageDest1 = dilatation(image2D, image, masque, taille);
- imageDest2 = erosion(image2D, image, masque, taille);
- imageDest = difference(imageDest1, imageDest2, image);
- break;
- case 17:
- perimetre = calculPerimetre(image2D, image);
- printf("Perimetre: %d - Total: %d\n", perimetre, image->hauteurImage*image->largeurImage);
- surface = calculSurface(image2D, image);
- printf("Surface: %d - Total: %d\n", surface, image->hauteurImage*image->largeurImage);
- printf("Circularite Geometrique: %f\n", circulariteGeometrique(perimetre, surface));
- break;
- case 18:
- perimetre = perimetreCrofton(image2D, image);
- printf("Perimetre: %d - Total: %d\n", perimetre, image->hauteurImage*image->largeurImage);
- surface = calculSurface(image2D, image);
- printf("Surface: %d - Total: %d\n", surface, image->hauteurImage*image->largeurImage);
- printf("Circularite Geometrique (Crofton): %f\n", circulariteGeometrique(perimetre, surface));
- break;
- case 19:
- imageTableau2ImageRGB(imageDest, image);
- ecrisBMPRGB_Dans(image, "image-convoluer.bmp");
- break;
- case 20:
- continuer = false;
- break;
- }
- }
- system("PAUSE");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement