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

Images Discussion :

transformer une matrice en image sous MATLAB sans changer les valeurs des pixels


Sujet :

Images

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut transformer une matrice en image sous MATLAB sans changer les valeurs des pixels
    Bonjour a tous.
    J'analyse deux images (A et B) représentant le même objet sous MATLAB. Du fait de leur acquisition différente, je sais qu'il y a un léger décalage entre ces deux images. Après avoir déterminer les coordonnées des points contrôles, j'ai modifier l'image B en faisant t=cp2tform(coorA, coorB, 'lwm') puis new2=imtransform(B, t). Après avoir obtenu la nouvelle matrice de B (50*50 single), j'ai transformer cette dernière en image tif. Mon problème est que dans la nouvelle matrice, l'intensité des pixels est donne en nombre réel, mais que sur ma nouvelle image (en 8-bit), les pixels apparaissent en nombre entier (je perd donc énormément d'informations). A contrario, les pixels de mes images initiales (32bit) sont eux en nombres réels. Le fait de changer le nombre de bit de mon image final B ne change pas le fait d'avoir toujours des nombres entiers.
    Question: ya t'il une façon, astuce, pour pouvoir transformer une matrice en image tout en gardant exactement l'information ?
    Merci pour tout

  2. #2
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Une image est une représentation spéciale d'une scène, d'un objet ...

    Les valeur de chaque pixel de l'image est soit une couleur (3x255) ou d'un niveau de gris (1x255). Donc quelque soit le contenu de l'image, chaque pixel correspond à une valeur entière.

    Sous matlab, quand tu lis une image, celle-ci va se retrouver dans une matrice avec un type de donnée approprié. Si tu effectue des traitement sur cette matrice, et comme par hasard ta matrice résultat est sous forme de nombre réels (exp.: 155,669), si tu enregistre ou tu affiche ton image, matlab va tronquer les valeurs, et ne prendra que la partie entière de chaque composante.

    Du fait, tu ne peux pas sauvegarder ta matrice résultat dans un fichier en gardant ses valeurs, sauf dans le cas ou tu définie par toi même le format du fichier de sauvegarde de l'image. Ce que l'on appelle format Brute.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    help imwrite
    help fwrite
     
    see also : fopen, fread, fprintf, save, diary.

  3. #3
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 304
    Points : 52 882
    Points
    52 882
    Par défaut
    C'est ce qui est écrit dans la documentation de IMWRITE :

    Class Support

    If the input array is of class double, and the image is a grayscale or RGB color image, imwrite assumes the dynamic range is [0,1] and automatically scales the data by 255 before writing it to the file as 8-bit values.

    If the input array is of class double, and the image is an indexed image, imwrite converts the indices to zero-based indices by subtracting 1 from each element, and then writes the data as uint8.
    Et si tu nous expliquais un peu ce que tu comptes faire avec ces "nouvelles" images ?

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Voila précisément ce que je fait: j'utilise un microscope pour observer un même objet que je "photographie" en utilisant deux filtres, d'ou image A et B. Je sais que mes deux lasers ne sont pas parfaitement aligner. Je veux donc corriger cette erreur. Mes images sont en tif 32bit que 'j'ouvre" sous ImageJ. Dans ce cas, les pixels ne m'apparaissent pas entiers mais en réel. Après avoir importer ces images sous Matlab, les nombres dans ma nouvelle matrice sont eux aussi en réel. Mon problème est que je veux visualiser ma nouvelle matrice transformer sous forme d'image, d'où l'idée d'enregistrer cette matrice en image Tif pour qu'ImageJ puisse la lire.
    Ce que je ne comprend pas, c'est que je puisse "lire" les pixels en nombre reel sur mes images initiales A et B ainsi que dans mes matrices, mais qu'apres enregistrement de ma nouvelle matrice, les pixels soient tous arrondis a l'entier le plus proche. Existe t'il un format d'image qui me permette de garder toute mon information ?

  5. #5
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Voila précisément ce que je fait: j'utilise un microscope pour observer un même objet que je "photographie" en utilisant deux filtres, d'ou image A et B.
    Les dispositifs d'acquisition d'images donnent toujours des images avec une représentation entière pour les formats connus (bmp, tif, gif, ...)


    Citation Envoyé par bunnygirl31 Voir le message
    Mes images sont en tif 32bit que 'j'ouvre" sous ImageJ. Dans ce cas, les pixels ne m'apparaissent pas entiers mais en réel.
    Tu es sûr ? Tu peux poster un exemple.

    Citation Envoyé par bunnygirl31 Voir le message
    Après avoir importer ces images sous Matlab, les nombres dans ma nouvelle matrice sont eux aussi en réel.
    C'est étrange tout ça

    Citation Envoyé par bunnygirl31 Voir le message
    Mon problème est que je veux visualiser ma nouvelle matrice transformer sous forme d'image, d'où l'idée d'enregistrer cette matrice en image Tif pour qu'ImageJ puisse la lire.
    Question: pourquoi ne pas utiliser imshow, imagesc, ...

    Citation Envoyé par bunnygirl31 Voir le message
    Ce que je ne comprend pas, c'est que je puisse "lire" les pixels en nombre reel sur mes images initiales A et B ainsi que dans mes matrices, mais qu'apres enregistrement de ma nouvelle matrice, les pixels soient tous arrondis a l'entier le plus proche.
    Question; Que signifie pour toi une valeur de 128.51 en terme de niveau de gris

    Citation Envoyé par bunnygirl31 Voir le message
    Existe t'il un format d'image qui me permette de garder toute mon information ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >> doc imwrite 
    
    Class Support
    
    The input array A can be of class logical, uint8, uint16, or double. Indexed images (X) can be of class uint8, uint16, or double; the associated colormap, map, must be of class double. Input values must be full (non-sparse).
    The class of the image written to the file depends on the format specified. For most formats, if the input array is of class uint8, imwrite outputs the data as 8-bit values. If the input array is of class uint16 and the format supports 16-bit data (JPEG, PNG, and TIFF), imwrite outputs the data as 16-bit values. If the format does not support 16-bit values, imwrite issues an error. Several formats, such as JPEG and PNG, support a parameter that lets you specify the bit depth of the output data.
    If the input array is of class double, and the image is a grayscale or RGB color image, imwrite assumes the dynamic range is [0,1] and automatically scales the data by 255 before writing it to the file as 8-bit values.
    If the input array is of class double, and the image is an indexed image, imwrite converts the indices to zero-based indices by subtracting 1 from each element, and then writes the data as uint8. 
    If the input array is of class logical, imwrite assumes the data is a binary image and writes it to the file with a bit depth of 1, if the format allows it. BMP, PNG, or TIFF formats accept binary images as input arrays.
    Est-ce que tu peux nous attacher une image pour faire les tests en local et te confirmer ?

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Poster un exemple pour ImageJ est difficile, le truc c'est que quand je regarde l'intensité d'un pixel, ce dernier m'apparait avec plusieurs chiffres après la virgule. Par exemple, dans l'image B que j'ai mis en attache, le pixel en haut a gauche m'apparait à 12,028168.

    Après avoir transformé ma matrice B avec les fonctions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >> t=cp2tform(G, R, 'lwm') 
    newB=imtransform(B, t)
    Voilà ce que j'obtiens quant je regarde ma nouvelle matrice :
    12.02804 17.41851 15.11983
    16.12415 16.80476 16.75399
    15.40941 21.88876 24.48726
    Pourquoi ne pas utiliser IMSHOW, IMAGESC ? Parce qu'après, je veux pouvoir visualiser ma nouvelle image sous ImageJ pour pouvoir la comparer à l'image A.
    Plus précisément, je cherche à connaitre la distance qui existe entre les pixels les plus intenses sur ces deux images. D'où l'idée de ne pas 'perdre' d'information.

    Pour visualiser ma nouvelle matrice, voila ce que je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mx=max(max(newB));
    i=double(newB)/double(mx);
    imwrite(i, 'i.tif');
    Dans ce cas, les valeurs dans la matrice sont entières:
    42 60 52
    56 58 58
    53 76 85
    58 52 100
    Question: Que signifie pour toi une valeur de 128,51 en terme de niveau de gris: Pas grand chose, je pense que le pixel sera visualiser à 128 mais il garde l'info du .51 (et c'est ca qui m'intéresse).

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    voila l'image B compresser
    Fichiers attachés Fichiers attachés
    • Type de fichier : zip B.zip (427 octets, 154 affichages)

  8. #8
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Matlab ne peux pas enregistrer des image tif en format double ou réels avec virgule flottante.

    Il y a une autre façon de faire, tu converti les valeur de ton image en hexa, ensuite tu sauve le résultat en tif.

    Regarde ce post, il pourra t'aider >>>>

    N'oublie pas aussi :

    >> how to save tif image with double values

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/12/2008, 20h35
  2. Réponses: 5
    Dernier message: 06/08/2008, 16h24
  3. Réponses: 11
    Dernier message: 02/06/2008, 22h07
  4. Transformer une matrice 255x255 en sous-matrices 8x8
    Par omar-malek dans le forum MATLAB
    Réponses: 3
    Dernier message: 02/04/2008, 17h26

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