IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Extraire la valeur d'un pixel d'une image


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Extraire la valeur d'un pixel d'une image
    Bonjour,

    Je me permets de vous exposer mon problème que je ne parviens pas à résoudre. Dans une partie de ma chaine de traitements, j'aimerais extraire la valeur d'un pixel dans une image (une classification en l'occurrence) dont les coordonnées (numéro de ligne et de colonne) sont présentes dans le fichier texte « point_ctrl.txt ». Cette valeur de pixel doit être ensuite enregistrée dans un autre fichier texte « numero_classe_eau.txt ».
    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #define LARGEUR 5058 // Largeur à modifier en fonction de l'image d'entrée
    #define HAUTEUR 7112 // Hauteur à modifier en fonction de l'image d'entrée
     
    //--------------------------------------------------
    // Déclaration des variables
    //--------------------------------------------------
    unsigned char image[LARGEUR][HAUTEUR];			// la matrice de l'image originale
    char nomFichier[] = "Image\\KmeansSTEP2withMask_output.tif "; 	// nom du fichier image à lire
     
    FILE* fichier;									// la variable fichier	
    int pixel;					           			// variable tampon
    int x, y;										// variables d'itération  --> y-x : Hauteur-Largeur
    int colonne, ligne ; 
    unsigned char class ;
     
    /*********************************Fonctions***********************************/ 
    int Recuperation_pt_ctrl()
    {
     
     
      FILE *Hfile ;
     
      if((Hfile=fopen("point_ctrl.txt", "r"))==NULL)
      {
        fprintf(stderr, "Erreur d'ouverture du fichier .txt\n") ;
        return EXIT_FAILURE ;
      }
     
     
      while(!feof(Hfile)) // feof (END OF FILE) indique la fin du fichier (marquage automatique lors ouverture) 
      {
        if((fscanf(Hfile, "colonne=%d\n", &colonne))==1)
        {
        }
        else if((fscanf(Hfile, "ligne=%d\n", &ligne))==1)
        {
        }
     
      }
     
      fclose(Hfile) ;
     
      return 0;
    }
     
    int Selection_class_hydro()
    {
    	//--------------------------------------------------
    	// Lecture du ou des fichier(s)
    	//--------------------------------------------------
    	// Image 1 (la plus couramment utilisée)
    	fichier = fopen( nomFichier, "rb" );	// ouverture du fichier en lecture binaire (rb) 
     
    	if( fichier==0 )
    	{	// Erreur d'ouverture
    		printf( "Desole, mais le fichier est introuvable ! Le programme va s'arreter..." );
    		return 1;
    	}
    	printf( ">> Lecture de l'image \"%s\" [", nomFichier );
     
    	for( y=0; y<HAUTEUR; y++ )
    	{	// lecture sur l'axe Y
    		for( x=0; x<LARGEUR; x++ )
    		{	// lecture sur l'axe X (=lecture d'une ligne)
    			image[x][y] = fgetc(fichier);
    		}
    	}
     
    	fclose(fichier);	// fermeture du fichier
    	printf( "]\n>> Lecture de l'image terminee !\n" );
     
    	//--------------------------------------------------
    	// Selection de la classe
    	//--------------------------------------------------	
     
    	class = image[colonne][ligne] ;
    	printf( "%d -" , class);
     
    	return 0;
     
    }
     
    int Export_classe ()
    {
    	FILE * pFile;
     
    	pFile = fopen ("numero_classe_eau.txt","w");
    	fprintf (pFile, "%d \n",class);
    	printf ("Export du numéro de classe dans le fichier texte terminee ");
     
    	fclose (pFile);
     
    	return 0;
    }
     
     
     
    /***********************************MAIN*************************************/
     
    int main(int argc, char *argv[])
    {
     
     
    	Recuperation_pt_ctrl(colonne, ligne) ;
    	printf("################### \n") ;
    	printf("%d \n", colonne) ; 
    	printf("%d\n", ligne) ;
    	printf("################### \n") ;
     
    	Selection_class_hydro(class);
    	printf("\n ################### \n") ;
    	Export_classe ();
    //	printf("%d\n", class) ;
     
    	return EXIT_SUCCESS ;
     
     
    }
    Ce dernier permet de récupérer les coordonnées du fichier .txt et de les affecter aux variables "ligne" et "colonne" néanmoins il retourne toujours une valeur de pixel incorrecte. Je ne comprends pas pourquoi.
    L’écriture de cette valeur dans le fichier « numero_classe_eau.txt » s'effectue quant à elle correctement.
    Pouvez-vous m'aider à y voir plus clair au sujet de l'extraction de la valeur du pixel ?

    Je vous remercie par avance pour vos informations.

    Azgard

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je ferai quelques remarques avant même d'attaquer le code.
    Les variables globales sont à bannir. D'ailleurs, votre appel à la fonction Recuperation_pt_ctrl est complètement fausse. Soit disant, elle n'accepte pas d'arguments mais vous en passez deux.
    De plus, chaque variable devrait recevoir une valeur à sa déclaration. Cela évite des montagnes d'erreur.

    Maintenant, voyons voir comment trouver l'erreur. Est-ce que les coordonnées ligne/colonne sont correctement lues à partir du fichier ? Vous pouvez vérifier en utilisant printf().
    Ensuite est-ce que la colonne/ligne sont bien reçues dans la fonction de récupération de la classe. Un second printf vous aidera.

    Voilà, pour le moment.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Merci pour votre réponse.
    Dans un premier temps j'ai essayé de suivre vos conseils concernant les variables globales. Cependant je ne parviens à mettre les variables suivantes, qui interviennent dans plusieurs fonctions, en argument :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unsigned char image[LARGEUR][HAUTEUR];			
    char nomFichier[] = "Image\\resize_KmeansSTEP2withMask_output.tif "; 
    int colonne = 0;
    int ligne = 0 ; 
    float class = 0 ;
    Voici le code modifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    #include <stdio.h>
    #include <stdlib.h>
     
    #define LARGEUR 400 // Largeur à modifier en fonction de l'image d'entrée
    #define HAUTEUR 400 // Hauteur à modifier en fonction de l'image d'entrée
     
    //--------------------------------------------------
    // Déclaration des variables
    //--------------------------------------------------
     
    unsigned char image[LARGEUR][HAUTEUR];			// la matrice de l'image originale
    char nomFichier[] = "Image\\resize_50xKmeansSTEP2withMask_output.tif "; 	// nom du fichier image à lire
    int colonne = 0;
    int ligne = 0 ; 
    int class = 0 ;
     
    /*********************************Fonctions***********************************/ 
     
     
    int Recuperation_pt_ctrl()
    {
     
    	FILE *Hfile ;
     
    	if((Hfile=fopen("point_ctrl.txt", "r"))==NULL)
    	{
    		fprintf(stderr, "Erreur d'ouverture du fichier .txt\n") ;
    		return EXIT_FAILURE ;
    	}
     
     
    	while(!feof(Hfile)) // feof (END OF FILE) indique la fin du fichier (marquage automatique lors ouverture) 
    	{
    		if((fscanf(Hfile, "colonne=%d\n", &colonne))==1)
    		{
    		}
    		else if((fscanf(Hfile, "ligne=%d\n", &ligne))==1)
    		{
    		}
     
    	}
     
    	fclose(Hfile) ;
     
    	printf("################### \n") ;
    	printf("FONCTION Recuperation_pt_ctrl\n") ;
    	printf("%d \n", colonne) ; 
    	printf("%d\n", ligne) ;
    	printf("################### \n") ;
     
    	return 0;
    }
     
    /*********************************/
     
    int Selection_class_hydro(colonne, ligne, class)
    {
     
    	//--------------------------------------------------
    	// Lecture du ou des fichier(s)
    	//--------------------------------------------------
     
    	FILE* fichier;							// la variable fichier	
    	fichier = fopen( nomFichier, "r" );	// ouverture du fichier 
    	int x, y;				// variables d'itération  --> y-x : Hauteur-Largeur
     
    	if( fichier==0 )
    	{	// Erreur d'ouverture
    		printf( "Desole, mais le fichier est introuvable ! Le programme va s'arreter..." );
    		return 1;
    	}
    	printf( ">> Lecture de l'image \"%s\" [", nomFichier );
     
    	for( y=0; y<HAUTEUR; y++ )
    	{	// lecture sur l'axe Y
    		for( x=0; x<LARGEUR; x++ )
    		{	// lecture sur l'axe X (=lecture d'une ligne)
    			image[x][y] = fgetc(fichier);
    		}
    	}
     
    	fclose(fichier);	// fermeture du fichier
    	printf( "]\n>> Lecture de l'image terminee !\n" );
     
     
    	//--------------------------------------------------
    	// Selection de la classe
    	//--------------------------------------------------	
     
    	printf("################### \n") ;
    	printf("FONCTION Selection_class_hydro\n") ;
    	printf("%d \n", colonne) ;						// Verification des valeurs de colonne et ligne dans la fct
    	printf("%d\n", ligne) ;
    	printf("################### \n") ;
     
    	class = image[colonne][ligne] ;
    	printf( "class = %d \n" , class);
     
    	return 0;
     
    }
     
    /*********************************/
     
    int Export_classe(class)
    {
    	FILE * pFile;
     
    	pFile = fopen ("numero-classe_eau.txt","w");
    	fprintf (pFile, "%d \n",class);
    	printf ("Export du numéro de classe dans le fichier texte terminee \n ");
    	printf("################### \n") ;
    	fclose (pFile);
     
    	return 0;
    }
     
     
     
    /***********************************MAIN*************************************/
     
    int main(int argc, char *argv[])
    {
     
    	Recuperation_pt_ctrl() ;
     
    	Selection_class_hydro(colonne, ligne, class);
     
    	Export_classe (class);
     
    	return EXIT_SUCCESS ;
     
    }
    Dans un second temps j'ai vérifié que les variables "colonne" et "ligne" étaient bien reçues dans la fonction "Selection_class_hydro".
    C'est bien le cas, voilà ce que me retourne le code ci-dessus:

    ###################
    FONCTION Recuperation_pt_ctrl
    143
    4
    ###################
    >> Lecture de l'image "Image\resize_KmeansSTEP2withMask_output.tif " []
    >> Lecture de l'image terminee !
    ###################
    FONCTION Selection_class_hydro
    143
    4
    ###################
    class = 0
    Export du numéro de classe dans le fichier texte terminee
    Je ne parviens pas à voir ce qui cloche.
    Si ça peut aider, je peux vous transmettre l'image test et le fichier txt en entrée.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    image[x][y] = fgetc(fichier);
    j'aurais mis les données dans l'autre sens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    image[y][x] = fgetc(fichier);
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Tu ne pourras pas lire un fichier .tif aussi simplement. Il contient des informations d'entête, et des données sûrement compressées.
    => Documentation

  6. #6
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Hello IAzgardI,

    Citation Envoyé par Winjerome Voir le message
    Tu ne pourras pas lire un fichier .tif aussi simplement. Il contient des informations d'entête, et des données sûrement compressées.
    Je ne l'ai jamais employée, mais peut-être la libtiff te sera-t-elle d'un grand secours....
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Merci pour vos remarques et informations.

    Le problème vient surement du format de données utilisé en effet.
    Je vais me pencher sur vos documentations et sur la libtiff.

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/05/2009, 20h37
  2. Réponses: 4
    Dernier message: 24/12/2008, 20h35
  3. Valeur d'un pixel d'une image> 255
    Par dasou dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/04/2007, 10h51
  4. Valeur de la couleur d'un pixel d'une image
    Par PiPo123 dans le forum Windows
    Réponses: 4
    Dernier message: 10/03/2007, 21h42
  5. Réponses: 1
    Dernier message: 08/03/2007, 15h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo