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 :

Diviser une image en deux images.


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2009
    Messages
    220
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 220
    Par défaut Diviser une image en deux images.
    Salut,

    J'ai une image qui contient deux petites images séparées par un espace (voir pièce jointe).

    Comment je pourrai déterminer l'espace entre les deux images et la couper en deux images séparées ?

    Je suis débutant en traitement d'image et j'ai besoin de vos aides.

    Merci beaucoup d'avance.
    Images attachées Images attachées  

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 304
    Par défaut
    Salut,

    Connais-tu les dimensions des images, la séparation est-elle toujours au milieu des images ou est-ce à chaque fois différent ?

    Dans le premier cas avec PIL tu pourras extraire chacune des images très simplement, dans le second cas, il te faudra une interface graphique qui implemente une sélection rectangulaire te permettant de récupérer les géométries des images séparées.

    Note que avec ta simple visionneuse d'image par défaut de ton OS, tu devrais déjà avoir une idée des tailles des sous-images.

  3. #3
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Vous pouvez utiliser le module PIL pour analyser l'image.
    Par exemple le code suivant mets la valeur de la couleur des pixels dans un tableau colonne/ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from PIL import Image
     
     
    im = Image.open("image.GIF")
    x, y = im.size
    lng = []
    imdata = []
    for value in list(im.getdata()):
        lng.append(value)
        if len(lng) == x:
            imdata.append(lng)
            lng = []
    print(imdata)
    Le souci que vous allez avoir c'est que ce n'est pas du blanc (valeur 255):
    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
    from PIL import Image
     
     
    im = Image.open("image.GIF")
    x, y = im.size
    # Blank = im.getpixel((0, 0))
    Blank = range(249, 256) # Blank = 255
    lng = []
    imdata = []
    for value in list(im.getdata()):
        lng.append(value)
        if len(lng) == x:
            imdata.append(lng)
            lng = []
    for index in range(y):
        print(index, all([l[index] in Blank for l in imdata]))
    Vous allez donc devoir, et cela me gêne, utiliser des valeurs arbitraires. Par exemple un range(200, 256):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for index in range(y):
        booleen = all([l[index] in Blank for l in imdata])
        if booleen:
            print(index, booleen)
    Sortie
    (0, True)
    (1, True)
    (2, True)
    (3, True)
    (4, True)
    (5, True)
    (200, True)
    (201, True)
    (202, True)
    (203, True)
    (204, True)
    (205, True)
    (206, True)
    (207, True)
    (208, True)
    (209, True)
    (210, True)
    (211, True)
    (212, True)
    (213, True)
    (214, True)
    (215, True)
    (216, True)
    (217, True)
    (218, True)
    (219, True)
    (220, True)
    Comme vous le voyez cela donne aussi les bordures (c'est le piège) et votre ligne centrale est comprise entre les lignes 200 et 220. Il vous suffit donc de couper l'image à la ligne 200 + ((220-200)/2).

    Pour créer les deux images vous pouvez utiliser im.paste(image, box)
    Soit :
    im1 = im.paste(, (x1, y1, x2, y2))
    Un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from PIL import Image
     
     
    im = Image.open("image.GIF")
    x, y = im.size
    l = 210
    # a vous de trouver l
    im1 = Image.new("RGB", (l, y), "white") # Partie gauche
    im1.paste(im, (0, 0, x, y))
    im1.save("test1.jpg", "JPEG")
    Vous comprendrez que je vous laisse trouver comment trouver le milieu

    @+

  4. #4
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Oups !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from PIL import Image
     
     
    im = Image.open("image.GIF")
    x, y = im.size
    lng = []
    imdata = []
    for value in list(im.getdata()):
        lng.append(value)
        if len(lng) == x:
            imdata.append(lng)
            lng = []
    for index in range(x):
        print(index, all([l[index] in range(200, 256) for l in imdata]))
    Et pas range(y)...

  5. #5
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Petit coup de pouce pour effacer l'erreur
    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
    #istrue = []
    #for index in range(x):
    #    istrue.append((index, all([l[index] in range(200, 256) for l in imdata])))
    istrue = [(index, all([l[index] in Blank for l in imdata])) for index in range(x)]
    flag = False
    Start = None
    End = None
    for idx, item in istrue:
        if not item:
            if End:
                break
            flag = True
        if all((item, flag)):
            if Start:
                End = idx
        else:
            Start = idx
    print(Start + (End-Start)/2)
     
    values = [all([l[index] in Blank for l in imdata]) for index in range(x)]
    flag = False
    Start = None
    End = None
    for idx, item in enumerate(values):
        if not item:
            if End:
                break
            flag = True
        if all((item, flag)):
            if Start:
                End = idx
        else:
            Start = idx
    print(Start + (End-Start)/2)
    @+

  6. #6
    Membre confirmé
    Étudiant
    Inscrit en
    Février 2009
    Messages
    220
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2009
    Messages : 220
    Par défaut
    Merci beaucoup pour vos réponses!!

    Alors l'image peut contenir n'importe quoi le nécessaires c'est qu'il y a deux petites images et je ne connais pas leurs dimension (l'affichage de cet image est aléatoire).

    Moi j'ai penser à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Boucle pour balayer l'axe des xs;
        Boucle pour balayer l'axe des ys; 
            Si je trouve un pixel de couleur différent au blanc je rompe la boucle et je passe à l’abscisse suivant.
     
    ainsi de suite jusqu'à ce que je trouve l'espace blanc.
    C'est ça en bref mais comme j'avais dit je suis débutant (nul quoi) en traitement d'image et j'ai besoin de vos aides.

  7. #7
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Citation Envoyé par ysahel Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Boucle pour balayer l'axe des xs;
        Boucle pour balayer l'axe des ys; 
            Si je trouve un pixel de couleur différent au blanc je rompe la boucle et je passe à l’abscisse suivant.
     
    ainsi de suite jusqu'à ce que je trouve l'espace blanc.
    Ainsi vous allez avoir toutes les valeurs 'blanches', pas la séparation entre les images.
    Il faut vérifier que tout l'axe y comporte les valeurs voulues.

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

Discussions similaires

  1. Identifier une superposition ? Entre deux images après rotation
    Par Strange-Days dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 09/11/2012, 18h01
  2. Personnaliser une checkbox avec deux images simplement
    Par JeanJean75 dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 18/11/2009, 10h10
  3. Diviser une matrice en deux blocs
    Par smirovitch dans le forum MATLAB
    Réponses: 1
    Dernier message: 22/05/2006, 17h11
  4. Réponses: 10
    Dernier message: 30/06/2005, 12h20

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