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

Python Discussion :

Codage de l'information (Image négatif) [Python 3.X]


Sujet :

Python

  1. #21
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Citation Envoyé par f-leb Voir le message
    ... mais le principe est de calculer le niveau de gris avec les composantes RVB (faire une recherche sur le net), par exemple avec la formule :
    Luminance = 0,299 × Rouge + 0,587 × Vert + 0,114 × Bleu
    Oui si l'image (mode RGB) est une vraie image "en couleurs". Le passage positif / négatif + le abs(a - 255) me laissent à penser (cf l'image en exemple du premier post) que, même si l'image est en mode RGB, les 3 composantes d'un même pixel sont identiques. C'est une image couleur ... de teintes de gris.
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  2. #22
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 605
    Points : 56 718
    Points
    56 718
    Billets dans le blog
    40
    Par défaut
    fichtre, l'image de départ serait déjà en niveau de gris, ça change tout

  3. #23
    Futur Membre du Club
    Homme Profil pro
    Terminale S
    Inscrit en
    Octobre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Terminale S
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par f-leb Voir le message
    mais il faut refaire les entêtes dans le fichier de destination.
    Justement, je suis en train de me demander comment pourrait-on refaire les entêtes avec un programme? Octet par octet?

    Et puis, c'est vrai que le fait de ne pas créer une palette de couleur ferait une image 24 bits couleur gris, mais si par exemple on devrait mettre en place une palette pour que le fichier soit considéré comme un niveau de gris, serait-ce possible de créer une destination 8 bits à partir d'une image colorée 24 bits avec un programme? Je suis vraiment curieux à ce sujet

  4. #24
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Citation Envoyé par plxpy Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from struct import unpack
    f = open('04.bmp', 'rb')
    print(unpack("=2sI2HI", f.read(14)))
    print(unpack("3I2H6I", f.read(40)))
    Tu veux vraiment pas me donner ces infos ?
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  5. #25
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Sinon, je confirme que l'image donnée en exemple est une image mode RGB mais avec des niveaux de gris

    (pour le coup, j'ai utilisé PIL en python 2)

    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
    >>> from PIL import Image
    >>> negatif = Image.open('negatif3.jpg')
    >>> negatif.mode
    'RGB'
    >>> negatif.size
    (550, 368)
    >>> 
    >>> pixels = negatif.getdata()
    >>> len(pixels)
    202400
    >>> 550*368
    202400
    >>> 
    >>> pixels[0]
    (136, 136, 136)
    >>> 
    >>> for i in range(550*368):
    ...     assert len(set(pixels[i])) == 1
    ... 
    >>>
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  6. #26
    Futur Membre du Club
    Homme Profil pro
    Terminale S
    Inscrit en
    Octobre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Terminale S
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par plxpy Voir le message
    Tu veux vraiment pas me donner ces infos ?
    Oups, j'avais pas vu, c'était dans la première page, tenez le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    (b'BM', 1488056, 0, 0, 54)
    (40, 800, 620, 1, 24, 0, 1488002, 2834, 2834, 0, 0)
    Puis l'image en exemple a été rendu d'abord négatif, puis on a remis au niveau de gris.En gros, l'exercice est de partir d'une image de couleur, le rendre négatif, puis le colorier en niveau de gris, cette image de l'exemple doit être le résultat Et tout ça, en Python 3.
    L'image négatif est une étape accomplie, et la deuxième étape est en cours
    C'est pour cela que je cherche à savoir comment ajouter une palette de couleur, et modifier les entêtes (changer 24 bits en 8 bits, etc).
    Sinon, je n'ai pas très bien compris votre programme PIL en python 2.

  7. #27
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Mes dernières cartouches pour te convaincre que les valeurs dans les range sont incorrectes.


    Pourquoi ton programme "marche" (comme tu dis) ?

    Déjà, ce n'est pas parce qu'aucune exception n'est levée que ton script est correct, loin de là. Ne pas planter, c'est une condition nécessaire mais absolument pas suffisante !

    Ici, l'image que tu utilises a été traficottée (à la main) et ne respecte pas la définition du format bmp. Elle est trop grande de 2 octets et c'est ce qui te sauve (en apparence).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> f = open('04.bmp', 'rb')
    >>> print(unpack("=2sI2HI", f.read(14)))
    (b'BM', 1488056, 0, 0, 54)
    >>>
    >>> print(unpack("3I2H6I", f.read(40)))
    (40, 800, 620, 1, 24, 0, 1488002, 2834, 2834, 0, 0)
    On retrouve bien le mode RGB (24 bits par pixel), les 800 colonnes et 620 lignes.
    La taille de la partie "pixels", 1488002 ne correspond à rien !!!
    On devrait trouver 800 * 3 * 620 = 1488000 octets (et 1488054 pour la taille totale du fichier) !

    Pour t'en convaincre, utilise Paint (sous Windows) en créant une image qui a les mémes caractéristiques et sauvegarde la au format bmp, 24 bits par pixel. Paint est un client sérieux pour respecter le format bmp, non ?

    Rejoue ensuite les instructions unpack et regarde la différence.

    Utilise aussi ton script sur cette image et tu retrouveras l'exception que tu obtenais (premier post) : ce sont les range qui ne vont pas !



    Enfin, pour ce qui est du problème suivant (les palettes de couleurs), je t'invite à créer une nouvelle discussion pour ne pas mélanger tous les problèmes.
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  8. #28
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 605
    Points : 56 718
    Points
    56 718
    Billets dans le blog
    40
    Par défaut
    ...et modifier les entêtes
    plxpy t'a quasiment donné la solution ici.

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # entete de fichier 14 octets, fichier 'BM', taille fichier=1488056 octets, offset contenu BMP=54
    header_file = pack("=2sI2HI", b'BM', 1488056, 0, 0, 54)
    fic_dst.write(header_file)  # on ecrit l'entete dans le fichier de destination
    à poursuivre avec l'entête de l'image, etc.

    En gros, l'exercice est de partir d'une image de couleur, le rendre négatif, puis le colorier en niveau de gris, cette image de l'exemple doit être le résultat
    Donc pour le moment tu as bien un négatif en RVB (24 bits/pixel).
    Pour la palette en niveau de gris, il faut créer 256 lignes (valeurgris, R, B, V, 0) du style :
    (0, 0, 0, 0, 0)
    (1, 1, 1, 1, 0)
    (2, 2, 2, 2, 0)
    ...
    (255, 255, 255, 255, 0)
    Faire ça dans une boucle, bien sûr. (Quoi que je me demande s'il faut créer une palette pour ça...)
    Puis avec une formule du style valeurgris = 0,299 × Rouge + 0,587 × Vert + 0,114 × Bleu (voir #10) tu obtiens la couleur correspondante sur 1 octet avec la palette.

    Tout ceci est quand même bien lourd quand on connaît les modules PIL ou pillow (python 3)

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [JDK 1.6.0] Information image
    Par henri93 dans le forum Général Java
    Réponses: 8
    Dernier message: 14/08/2014, 10h45
  2. Réponses: 1
    Dernier message: 09/10/2006, 17h04
  3. Acquisition d'informations 3D à partir de séquences d'images
    Par Clad3 dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 31/05/2005, 15h31
  4. Réponses: 5
    Dernier message: 18/05/2005, 13h03
  5. Image en négatif
    Par jasmar dans le forum C++Builder
    Réponses: 1
    Dernier message: 19/03/2005, 19h11

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