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 :

Récupération des intensités d'une image dans une matrice


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 426
    Points : 183
    Points
    183
    Par défaut Récupération des intensités d'une image dans une matrice
    Bonsoir,
    Mon sujet consiste à afficher les intensité d'une image.bmp dans une matrice.
    En faite ce n'est pas mon sujet, c'est le sujet d'un amie.
    Bref, il a fait ce code, mais le résultat est fausse.
    Est ce que il est possible de corriger ce code ou y a il autrement.
    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
     
    /*lire l'image.bmp et afficher ses intensités dans une matrice
     
    #include <conio.h>
     
    #include <stdlib.h>
     
    #include <stdio.h>
     
    typedef struct
    {
    /* pas de sign car taille &lt; 4, probleme d'alignement */
    int taille; /* taille de l'image */
    int res; /* zone réservée */
    int offset; /* adresse du dbt de l'image */
    int info; /* taille de la zone info */
    int largeur; /* largeur de l'image */
    int longueur ; /* hauteur de l'image */
    short nbplan; /* nbre de plans */
    short bppixel; /* mode en bits / pixel */
    int comp; /* format de compression */
    int tim; /* taille de l'image en octets */
    int Hres; /* résolution Horizontale */
    int Vres; /* résolution Verticale */
    int nbco; /* nbre de couleurs utilisées */
    int impco; /* nbre de couleurs importantes */
    } bitmap_header;
     
    int mat_in[92][112];
    int pix,i,j;
     
    int main()
    {
     
    FILE *bmp_file;
    bitmap_header bmp_header;
    char sign[3];
     
    bmp_file=fopen ("C:\\Users\\user\\Desktop\\Processed histogram based Face Recognition\\ORL\\S1\\1.bmp","rb");
     
    fgets( sign, sizeof sign , bmp_file);
    puts(sign);
     
    /* lecture de l'hader en une seul ligne */
    fread( &bmp_header, sizeof bmp_header, 1, bmp_file );
     
    printf("largeur= %d, hauteur= %d\n", bmp_header.largeur, bmp_header.longueur);
     
    fclose(bmp_file);
     
    //return 0;
     
    for(i=0;i<bmp_header.longueur;i++)
    {	
    for(j=0;j<bmp_header.largeur;j++)
    {
    fscanf(bmp_file,"%d",&pix);
    mat_in[i][j]= pix; 
     
    }
     
    }
    fclose(bmp_file);
     
    printf(" ********* Fin lecture image ********\n");
     
     
     
     
    printf(" ***********Fin****************\n");
     
     
    return 0;
    Merci d'avance
    There is more than one way to do it

  2. #2
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Bonjour,

    Ton amie a presque juste.

    Un problème est qu'elle utilise la fonction fgets sur un fichier ouvert en mode binaire.

    Un autre souci est qu'elle lit l'entête du fichier BMP en un seul bloc. Il n'est pas sûr que la taille de chaque champs de la structure bitmap_header correspondent 1:1 aux champs du fichier.

    Il faudrait bien prévoir une fonction qui lit byte (char) par byte l'entête.
    Bien le bonjour chez vous
    Jowo

  3. #3
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Ton code ne compilait pas du tout, celui ci dessous y arrive. Après la ligne
    fclose(bmp_file);
    Tu continues à lire ton fichier (sans aucune vérification) comme si de rien n'était...

    Pour ce que j'ai compris de ton problème, en supposant que ton bmp soit en 32 bits par pixel, l'intensité d'un canal est 255, l'intensité max est donc 255 * 3 puisqu'il y a 3 canaux couleurs. Il faut donc séparer une couleur comme 0x123456 en trois intensités 0x12, 0x34 et 0x56 puis les additionner pour avoir l'intensité d'un pixel. Recopier le bitmap dans un tableau me semble trop simple.

    A+

    Pfeuh
    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
     
    /*lire l'image.bmp et afficher ses intensités dans une matrice*/
     
    #include <conio.h>
    #include <stdlib.h>
    #include <stdio.h>
     
    typedef struct
    {
        int taille; /* taille de l'image */
        int res; /* zone réservée */
        int offset; /* adresse du dbt de l'image */
        int info; /* taille de la zone info */
        int largeur; /* largeur de l'image */
        int longueur ; /* hauteur de l'image */
        short nbplan; /* nbre de plans */
        short bppixel; /* mode en bits / pixel */
        int comp; /* format de compression */
        int tim; /* taille de l'image en octets */
        int Hres; /* résolution Horizontale */
        int Vres; /* résolution Verticale */
        int nbco; /* nbre de couleurs utilisées */
        int impco; /* nbre de couleurs importantes */
    } bitmap_header;
     
    int mat_in[92][112];
    int pix,i,j;
     
    int main()
    {
     
        FILE *bmp_file;
        bitmap_header bmp_header;
        char sign[3];
        bmp_file=fopen ("splash_en.bmp","rb");
        fgets( sign, sizeof sign , bmp_file);
        puts(sign);
        fread( &bmp_header, sizeof bmp_header, 1, bmp_file );
        printf("largeur= %d, hauteur= %d\n", bmp_header.largeur, bmp_header.longueur);
     
        fclose(bmp_file);
     
        for (i=0;i<bmp_header.longueur;i++)
        {
            for (j=0;j<bmp_header.largeur;j++)
            {
                fscanf(bmp_file,"%d",&pix);
                mat_in[i][j]= pix;
     
            }
     
        }
        fclose(bmp_file);
        printf(" ********* Fin lecture image ********\n");
        printf(" ***********Fin****************\n");
        return 0;
    }

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Recopier le bitmap dans un tableau me semble trop simple.
    c'est pourtant la majorité des formats d'images

    Après vient l'interprétation..

    Gif est directement accessible en tableau. Une table de correspondance entre valeur du pixel et triplet (R,G,B) est fournie en entête.

    Même chose avec jpeg.

    Même chose pour les films avec Mpeg (sauf que là il y a en plus l'analyse / la reconstruction des différences).

    Pour .bmp il suffit d'aller voir le format...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    c'est pourtant la majorité des formats d'images
    Bon, je vais dans ce cas terminer ma phrase:

    Recopier le bitmap dans un tableau pour avoir un tableau d'intensités me semble trop simple.

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Il faut donc séparer une couleur comme 0x123456 en trois intensités 0x12, 0x34 et 0x56 puis les additionner pour avoir l'intensité d'un pixel
    Tout dépend ce qu'on entend par "intensité". Souvent, c'est une combinaison linéaire des RGB dont les coefficients dépendent de la définition de l'intensité. (Voir par exemple le codage YUV)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 426
    Points : 183
    Points
    183
    Par défaut
    Merci pour l'aide
    Mon amie à résolu son problème
    There is more than one way to do it

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Manipulation d'images : intégrer une image dans une image
    Par noscollections dans le forum VB.NET
    Réponses: 2
    Dernier message: 17/10/2014, 11h51
  2. [MySQL] récupération des valeurs d'un formulaire d'une page dans une autre page
    Par CSI2012 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 06/02/2013, 13h43
  3. Mettre une Image dans une Image
    Par shadowhocine dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 19/12/2006, 18h40
  4. Réponses: 3
    Dernier message: 30/10/2006, 11h21
  5. Insérer une légende dans une image avec une police plus petite
    Par Paulinho dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 3
    Dernier message: 29/04/2006, 14h19

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