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 :

[ image ] Probléme d'indexation des pixels


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2010
    Messages : 10
    Par défaut [ image ] Probléme d'indexation des pixels
    Bonjour a vous.

    J'essai tant bien que mal de développer une application traitant des images ppm .

    Je dispose déjà d'une fonction de lecture est d'écriture de l'image en format ppm ASCII, ainsi que d'une fonction de seuilage des teintes, qui travail sur l'intégralité de l'image.

    Je cherche à afficher une croix sur mon image à une position précise, mais le résultat obtenu n'est pas celui attendu. La ligne horizontal est faite sans probléme, mais pas la ligne verticale, qui se présente sur plusieur colonnes est en pointillé.

    Voici le 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
    typedef struct {float R, G, B;} RGB;
    typedef struct {RGB *pixel;unsigned int Nx;unsigned int Ny;int isB;} image; //Nx et Ny les dimensions de l'image
     
    void croix(const unsigned int X, const unsigned int Y, image* img) {//X et Y les coordonées du centre de la croix
    	unsigned int i,j;
     
    	unsigned int size_x=img->Nx;
     
    	i=X;
    	for(j=Y-5;j<=Y+5;j++) {				
    		img->pixel[size_x*j+i].R = 240;
    		img->pixel[size_x*j+i].G = 0;
    		img->pixel[size_x*j+i].B = 0;
    	}
     
    	j=Y;//NOC
    	for(i=X-5;i<=X+5;i++) {
    		img->pixel[size_x*j+i].R = 240;
    		img->pixel[size_x*j+i].G = 0;
    		img->pixel[size_x*j+i].B = 0;
    	}
    }

  2. #2
    Membre émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Par défaut
    Bizarre, le code à l'air correct. Et j'ai testé vite fait avec
    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
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    typedef struct {unsigned int R, G, B;} RGB;
    typedef struct {
    	RGB *pixel;
    	unsigned int max;
    	unsigned int Nx;
    	unsigned int Ny;
    	char *com[2];
    	int isB;
    } image;
     
     
    void croix(const unsigned int X, const unsigned int Y, image* img) {
    	unsigned int i,j;
     
    	unsigned int size_x=img->Nx;
     
    	i=X;
    	for(j=Y-5;j<=Y+5;j++) {
    		img->pixel[size_x*j+i].R = 240;
    		img->pixel[size_x*j+i].G = 0;
    		img->pixel[size_x*j+i].B = 0;
    	}
     
    	j=Y;//NOC
    	for(i=X-5;i<=X+5;i++) {
    		img->pixel[size_x*j+i].R = 240;
    		img->pixel[size_x*j+i].G = 0;
    		img->pixel[size_x*j+i].B = 0;
    	}
    }
     
    static int add_pixel(image *image, unsigned int pos, unsigned int value)
    {
    	unsigned int real_pos = pos/3;
    	if (real_pos >= image->Nx*image->Ny)
    		return 1;
    	switch (pos%3) {
    		case 0: image->pixel[real_pos].R = value; break;
    		case 1: image->pixel[real_pos].G = value; break;
    		case 2: image->pixel[real_pos].B = value; break;
    	}
    	return 0;
    }
     
    static int ppm(image *img)
    {
    	char buf[256];
    	int line_nb = 0;
    	int done = 0;
    	while ((fgets(buf, sizeof(buf), stdin))) {
    		if (line_nb < 2) {
    			if (!(img->com[line_nb] = strdup(buf)))
    				return 1;
    		} if (line_nb == 2) {
    			if (sscanf(buf, "%d %d", &img->Nx, &img->Ny) != 2)
    				return 2;
    			if (!(img->pixel = malloc(sizeof(*img->pixel)*img->Nx*img->Ny)))
    				return 3;
    		} else if (line_nb == 3) {
    			if (sscanf(buf, "%u", &img->max) != 1)
    				return 4;
    		} else if (line_nb > 3) {
    			unsigned int p;
    			if (sscanf(buf, "%u", &p) != 1)
    				return 5;
    			if (add_pixel(img, line_nb-4, p))
    				return 6;
    			done++;
    		}
    		++line_nb;
    	}
    	if (done != img->Nx*img->Ny*3) {
    		fprintf(stderr, "done=%d, Nx=%d, Ny=%d\n", done, img->Nx, img->Ny);
    		return 5;
    	}
    	croix(30, 30, img);
    	return 0;
    }
     
    static int dump_ppm(image *img)
    {
    	int i;
    	for (i = 0; i < 2; ++i) {
    		printf("%s", img->com[i]);
    	}
    	printf("%u %u\n", img->Nx, img->Ny);
    	printf("%u\n", img->max);
    	for (i = 0; i < img->Nx*img->Ny; ++i) {
    		printf("%u\n", img->pixel[i].R);
    		printf("%u\n", img->pixel[i].G);
    		printf("%u\n", img->pixel[i].B);
    	}
    	return 0;
    }
     
    static void free_ppm(image *img)
    {
    	free(img->pixel);
    	free(img->com[0]);
    	free(img->com[1]);
    }
     
     
    int main(void)
    {
    	image img;
    	int rc;
    	if ((rc = ppm(&img)))
    		return rc;
    	if ((rc = dump_ppm(&img)))
    		return rc;
    	free_ppm(&img);
    	return rc;
    }
    et un ppm basique (i.e. une seule valeur par ligne), j'ai bien une croix continue. Par contre j'ai mis des int à la place des floats (je ne pense pas que ça puisse venir de là). Poste les contenus de tes ppm.

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2010
    Messages : 10
    Par défaut
    Je viens de tester avec une image carré, le probléme semble venir des proportion de l'image.

    voici les fichiers testé:
    megaupload.com/?d=V0WV538U
    megaupload.com/?d=J8CE3NYL

  4. #4
    Membre émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Par défaut
    Citation Envoyé par xamber Voir le message
    Je viens de tester avec une image carré, le probléme semble venir des proportion de l'image.

    voici les fichiers testé:
    megaupload.com/?d=V0WV538U
    megaupload.com/?d=J8CE3NYL
    Bizarre, avec mon code modifié ça marche
    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
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    #define NB_COM 1
     
    typedef struct {unsigned int R, G, B;} RGB;
    typedef struct {
    	RGB *pixel;
    	unsigned int max;
    	unsigned int Nx;
    	unsigned int Ny;
    	char *com[NB_COM];
    	int isB;
    } image;
     
     
     
    void croix(const unsigned int X, const unsigned int Y, image* img) {
    	unsigned int i,j;
     
    	unsigned int size_x=img->Nx;
     
    	i=X;
    	for(j=Y-5;j<=Y+5;j++) {
    		img->pixel[size_x*j+i].R = 240;
    		img->pixel[size_x*j+i].G = 0;
    		img->pixel[size_x*j+i].B = 0;
    	}
     
    	j=Y;//NOC
    	for(i=X-5;i<=X+5;i++) {
    		img->pixel[size_x*j+i].R = 240;
    		img->pixel[size_x*j+i].G = 0;
    		img->pixel[size_x*j+i].B = 0;
    	}
    }
     
    static int add_pixel(image *image, unsigned int pos, unsigned int value)
    {
    	unsigned int real_pos = pos/3;
    	if (real_pos >= image->Nx*image->Ny)
    		return 1;
    	switch (pos%3) {
    		case 0: image->pixel[real_pos].R = value; break;
    		case 1: image->pixel[real_pos].G = value; break;
    		case 2: image->pixel[real_pos].B = value; break;
    	}
    	return 0;
    }
     
    static int ppm(image *img)
    {
    	char buf[256];
    	int line_nb = 0;
    	int done = 0;
    	while ((fgets(buf, sizeof(buf), stdin))) {
    		if (line_nb < NB_COM) {
    			if (!(img->com[line_nb] = strdup(buf)))
    				return 1;
    		} if (line_nb == NB_COM) {
    			if (sscanf(buf, "%d %d", &img->Nx, &img->Ny) != 2)
    				return 2;
    			if (!(img->pixel = malloc(sizeof(*img->pixel)*img->Nx*img->Ny)))
    				return 3;
    		} else if (line_nb == NB_COM+1) {
    			if (sscanf(buf, "%u", &img->max) != 1)
    				return 4;
    		} else if (line_nb > NB_COM+1) {
    			unsigned int p;
    			if (sscanf(buf, "%u", &p) != 1)
    				return 5;
    			if (add_pixel(img, line_nb-(NB_COM+2), p))
    				return 6;
    			done++;
    		}
    		++line_nb;
    	}
    	if (done != img->Nx*img->Ny*3) {
    		fprintf(stderr, "done=%d, Nx=%d, Ny=%d\n", done, img->Nx, img->Ny);
    		return 5;
    	}
    	croix(30, 30, img);
    	return 0;
    }
     
    static int dump_ppm(image *img)
    {
    	int i;
    	for (i = 0; i < NB_COM; ++i) {
    		printf("%s", img->com[i]);
    	}
    	printf("%u %u\n", img->Nx, img->Ny);
    	printf("%u\n", img->max);
    	for (i = 0; i < img->Nx*img->Ny; ++i) {
    		printf("%u\n", img->pixel[i].R);
    		printf("%u\n", img->pixel[i].G);
    		printf("%u\n", img->pixel[i].B);
    	}
    	return 0;
    }
     
    static void free_ppm(image *img)
    {
    	int i;
    	free(img->pixel);
    	for (i = 0; i < NB_COM; ++i)
    		free(img->com[i]);
    	return ;
    }
     
     
    int main(void)
    {
    	image img;
    	int rc;
    	if ((rc = ppm(&img)))
    		return rc;
    	if ((rc = dump_ppm(&img)))
    		return rc;
    	free_ppm(&img);
    	return rc;
    }
    Pour les deux images !
    Ça doit venir de ton parseur.

Discussions similaires

  1. problème d'indexation des pages authentifié
    Par cha3labou dans le forum Langage
    Réponses: 0
    Dernier message: 04/06/2010, 16h47
  2. Réponses: 4
    Dernier message: 17/09/2009, 20h52
  3. Réponses: 0
    Dernier message: 28/08/2009, 18h00
  4. Creer une image avec come info des pixels
    Par Battosaiii dans le forum Java ME
    Réponses: 3
    Dernier message: 29/07/2006, 15h54
  5. [image] Problème de suppression des max locaux avec Canny
    Par Rafoo dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 06/11/2005, 00h22

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