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

  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 307
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    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.

  8. #8
    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
    Un exemple complet pour voir ce que cela donne ?
    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
    from PIL import Image
     
     
    im = Image.open("image.GIF")
     
    x, y = im.size
    lng = []
    imdata = []
    mask = range(200, 256) # Pas de valeur 255 dans votre image.
    # On rempli le tableau avec les valeurs.
    for value in list(im.getdata()):
        lng.append(value)
        if len(lng) == x:
            imdata.append(lng)
            lng = []
    # Pour chaque ligne on verifie si les valeurs sont dans mask ce qui donne True, sinon False.
    # On stocke dans une liste sous la forme ((index, booleen),)
    istrue = [(index, all([l[index] in mask for l in imdata])) for index in range(x)]
    # Pas terrible : a revoir.
    flag = False
    Start = None
    End = None
    for idx, item in istrue: # Notre liste d'index/valeur donc
        if not item: # item = False
            # Si End != None nous avons Start et End donc notre separation
            if End:
                # Fin
                break
            # Si End == None c'est que c'etait la bordure de gauche
            flag = True
        if all((item, flag)): # Si flag == True et que item == True (une ligne qui remplie les conditions mask)
            # Si nous avons le depart Start
            if Start:
                # End deviens idx. En fin de boucle cela serat la derniere valeur idx valide.
                End = idx
        else:
            # Sinon c'est la premiere ligne valide donc Start
            Start = idx
    # On calcule le milieu de la 'bande'
    tocut = Start + (End-Start)/2
    # On 'coupe' deux parties de l'image suivant l'axe tocut
    crop1 = im.crop((0, 0, tocut, y))
    crop2 = im.crop((tocut, 0, x, y))
    # On cree des images vides aux dimensions
    im1 = Image.new("RGB", (tocut, y), "white")
    im2 = Image.new("RGB", (x-tocut, y), "white")
    # On colle dans les images les parties coupees
    im1.paste(crop1, (0, 0, tocut, y))
    im2.paste(crop2, (0, 0, x-tocut, y))
    # Et on enregistre.
    im1.save("test1.jpg", "JPEG")
    im2.save("test2.jpg", "JPEG")
    L'exemple reste cantonn� � la question (s�paration en deux images) et � l'image donn�e (mask) mais rien n�emp�che d'en faire une fonction du style def verticalcut(im, mask=(255,), nbimage=False)

    @+

  9. #9
    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
    Petite question :
    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).
    Le format de l'image est il toujours le m�me ? (GIF) Si ce n'est pas au m�me format im.getdata() risque de retourner un tuple de couleur RGB.
    La palette de couleur est elle toujours la m�me ? De cela vas d�pendre mask.

    Voici le code pour d�couper le fichier joint.
    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
    from PIL import Image, ImageColor
     
     
    im = Image.open("exemple.jpg")
     
    x, y = im.size
    mask = (75, 79, 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, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
            136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 147, 148, 149,
            152, 218, 219, 220, 221, 222, 223, 224)
    lng = []
    imdata = []
    for value in list(im.getdata()):
        if isinstance(value, tuple):
            value = (value[0]*299 + value[1]*587 + value[2]*114)/1000
        lng.append(value)
        if len(lng) == x:
            imdata.append(lng)
            lng = []
    istrue = [(index, all([l[index] in mask for l in imdata])) for index in range(x)]
    # Pas terrible : a revoir.
    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
     
    tocut = Start + (End-Start)/2
    crop1 = im.crop((0, 0, tocut, y))
    crop2 = im.crop((tocut, 0, x, y))
    im1 = Image.new("RGB", (tocut, y), "white")
    im2 = Image.new("RGB", (x-tocut, y), "white")
    im1.paste(crop1, (0, 0, tocut, y))
    im2.paste(crop2, (0, 0, x-tocut, y))
    im1.save("test1.jpg", "JPEG")
    im2.save("test2.jpg", "JPEG")
    Vous remarquerez premi�rement
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
         if isinstance(value, tuple):
            value = (value[0]*299 + value[1]*587 + value[2]*114)/1000
    Que vous pouvez rajouter dans votre code.
    Deuxi�mement mask... Ne demandez pas comment car c'est compl�tement 'arbitraire'.

    Maintenant il y a sans doute d'autres m�thodes : Je ne suis pas habitu� a manipuler les images.

    @+
    Images attach�es Images attach�es  

  10. #10
    Membre Expert 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 : 60
    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
    Par d�faut
    Bonjour,

    Je n'ai regard� les codes propos�s qu'en diagonale. Je n'interviens pas sur le fond mais il y a, n�anmoins, un petit probl�me concernant le "mask" et les pixels "blancs".

    Le format GIF s'appuye sur une table de couleurs et quand, via la m�thode getdata ou encore getpixel, on r�cup�re 251 , il s'agit de l'index dans cette table, sans corr�lation directe avec une quelconque couleur.

    Ici (voir les sp�cifications GIF), la table de couleur se pr�sente sous la forme de 256 triplets (R,G,B) � partir de l'offset 13, avec 1 octet non sign� par couleur (c'est alambiqu� mais c'est la spec, je n'y suis pour rien) :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> img = open('image.GIF')
    >>> img.seek(13)
    >>> color_table = list()
    >>> for i in range(256):
    ...     color_table.append(unpack('3B',img.read(3)))
    ... 
    >>> 
    >>> color_table[251]
    (255, 255, 255)
    La valeur 251 retourn�e via getdata ou getpixel correspond ici et seulement ici � (r,g,b) = (255,255,255), mais �a pourrait ne pas �tre le cas.


    Par exemple, je cr�e une nouvelle image en modifiant l'ordre des triplets (R,G,B) de la table (je mets les couleurs les plus claires en premier) :


    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
    >>> old = open('image.GIF')
    >>> new = open('new_image.GIF','wb')
    >>> 
    >>> # recopie des octets avant la table de couleurs
    ... new.write(old.read(13))
    >>> 
    >>> from struct import unpack
    >>> 
    >>> # je charge la table des couleurs actuelle
    ... color_table = [ unpack('3B',old.read(3))  for i in range(256) ]
    >>> 
    >>> # je la trie avec les couleurs claires en premier
    ... color_table.sort(key = lambda rgb: sum(rgb), reverse=True)
    >>>
    >>> # maintenant un 251 correspond au (r,g,b)
    ... print color_table[251]
    (0, 0, 0)
    >>>
    >>> # j'écris la nouvelle table de couleur
    ... for rgb in color_table:
    ...     new.write(pack('3B',*rgb))
    ... 
    >>> # j'écris le reste du fichier et ferme
    ... new.write(old.read())
    >>> new.close()
    L'image r�sultat est tr�s diff�rente, n'est-elle pas ? Cependant, on obtient toujours un 251 en guise de premier pixel :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    >>> new = Image.open('new_image.GIF')
    >>> list(new.getdata())[0]
    251
    >>> new.getpixel((0,0))
    251

    Pour travailler avec des couleurs "naturelles", la premi�re chose � faire apr�s l'ouverture de l'image (Image.open) est de la convertir (convert) en RGB - et travailler sur des triplets - ou en mode L (panchromatique)
    Images attach�es Images attach�es  

  11. #11
    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
    Merci pour les infos plxpy (et dire que j'ai �tudier les sp�cifications du format gif il n'y a pas longtemps... )

    Il suffit donc de passer par:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    im = Image.open("image.GIF")
    if im.mode != 'RGB':
        im = im.convert('RGB')
    Ce qui coller au code (qui est a revoir mais pas le temps) donne:
    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
    from PIL import Image
     
     
    im = Image.open("image.GIF")
    if im.mode != 'RGB':
        im = im.convert('RGB')
     
    x, y = im.size
    mask = range(200, 256)
    lng = []
    imdata = []
    for value in list(im.getdata()):
        if isinstance(value, tuple):
            value = (value[0]*299 + value[1]*587 + value[2]*114)/1000
        lng.append(value)
        if len(lng) == x:
            imdata.append(lng)
            lng = []
    istrue = [(index, all([l[index] in mask for l in imdata])) for index in range(x)]
    # Pas terrible : a revoir.
    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
     
    tocut = Start + (End-Start)/2
    crop1 = im.crop((0, 0, tocut, y))
    crop2 = im.crop((tocut, 0, x, y))
    im1 = Image.new("RGB", (tocut, y), "white")
    im2 = Image.new("RGB", (x-tocut, y), "white")
    im1.paste(crop1, (0, 0, tocut, y))
    im2.paste(crop2, (0, 0, x-tocut, y))
    im1.save("test1.jpg", "JPEG")
    im2.save("test2.jpg", "JPEG")
    Par chance la table des couleurs est dans l'ordre

    Une id�e pour ce qui est de trouver la 's�paration' ?

    @+

  12. #12
    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 PauseKawa Voir le message
    Une id�e pour ce qui est de trouver la 's�paration' ?
    A ben oui... im.convert('1')
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    from PIL import Image
     
     
    im = Image.open("image.GIF")
    im = im.convert('1')
    im.save("test1.jpg", "JPEG")
    Il suffit de localiser la bande blanche, qui l'est pour le coup...

    Maintenant il y a sans doute d'autres m�thodes : Je ne suis pas habitu� a manipuler les images.
    Je n'interviens pas sur le fond
    N'h�site surtout pas ! C'est un domaine ou je ne suis pas � l'aise.

    @+

  13. #13
    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�ponse. J'ai r�ussi � s�parer les deux images avec le code de pausekawa

    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
    from PIL import Image
     
     
    im = Image.open("image.GIF")
     
    x, y = im.size
    lng = []
    imdata = []
    mask = range(200, 256) # Pas de valeur 255 dans votre image.
    # On rempli le tableau avec les valeurs.
    for value in list(im.getdata()):
        lng.append(value)
        if len(lng) == x:
            imdata.append(lng)
            lng = []
    # Pour chaque ligne on verifie si les valeurs sont dans mask ce qui donne True, sinon False.
    # On stocke dans une liste sous la forme ((index, booleen),)
    istrue = [(index, all([l[index] in mask for l in imdata])) for index in range(x)]
    # Pas terrible : a revoir.
    flag = False
    Start = None
    End = None
    for idx, item in istrue: # Notre liste d'index/valeur donc
        if not item: # item = False
            # Si End != None nous avons Start et End donc notre separation
            if End:
                # Fin
                break
            # Si End == None c'est que c'etait la bordure de gauche
            flag = True
        if all((item, flag)): # Si flag == True et que item == True (une ligne qui remplie les conditions mask)
            # Si nous avons le depart Start
            if Start:
                # End deviens idx. En fin de boucle cela serat la derniere valeur idx valide.
                End = idx
        else:
            # Sinon c'est la premiere ligne valide donc Start
            Start = idx
    # On calcule le milieu de la 'bande'
    tocut = Start + (End-Start)/2
    # On 'coupe' deux parties de l'image suivant l'axe tocut
    crop1 = im.crop((0, 0, tocut, y))
    crop2 = im.crop((tocut, 0, x, y))
    # On cree des images vides aux dimensions
    im1 = Image.new("RGB", (tocut, y), "white")
    im2 = Image.new("RGB", (x-tocut, y), "white")
    # On colle dans les images les parties coupees
    im1.paste(crop1, (0, 0, tocut, y))
    im2.paste(crop2, (0, 0, x-tocut, y))
    # Et on enregistre.
    im1.save("test1.jpg", "JPEG")
    im2.save("test2.jpg", "JPEG")

    J'ai un petit probl�me. Comme chaque image peut prendre une forme al�atoire, pas n�cessairement carr�. Il y a beaucoup d'espaces blancs soit en haut, en bas ou aux cot�s de chaque image.

    Comment je pourrai centrer chaque image au milieu et supprimer tout ceux que j'en n'ai pas besoin (laisser que le n�cessaire) ??

  14. #14
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 069
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 069
    Par d�faut
    avec une image dont les bordures sont d'une couleurs unie(image retouch�e ici) avec une marge de 10 par canal, en se basant la couleur du 1er pixel(0,0).

    ce code dessine un cadre rouge selon le r�sultat qu'il trouve ... chez moi �a fonctionne.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from pygame import *
    img = image.load('imagetestmask.jpg')
    scr = display.set_mode(img.get_size())
    scr.blit(img,(0,0))
    msk = mask.from_threshold(img,img.get_at((0,0)),(10,10,10,255))
    msk.invert()
    for r in msk.get_bounding_rects():
        draw.rect(scr,Color('red'),r,2)
    display.flip()
    while event.wait().type != QUIT: pass
    l'image de test:

    r�sultat:

  15. #15
    Membre Expert 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 : 60
    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
    Par d�faut
    j'avais pr�par� une r�ponse sans voir les deux derni�res interventions. Je la poste quand m�me

    Pour d�terminer la colonne o� l'on effectue le d�coupage, et si :

    • les deux images d'origine n'ont pas pivot� quand l'image globale est cr��e (images "en crabe"), avec, donc, une s�paration bien verticale
    • les marges/le fond sont bien diff�rents des images (ici marges claires et images sombres)


    on peut travailler sur l'image convertie en mode 'L' (niveaux de gris) et passer en dimension 1 en calculant la ligne moyenne de l'image :


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    >>> img = Image.open('image.GIF').convert('L')
    >>> ncols, nrows = img.size
    >>> pixels = list(img.getdata())
    >>> rows = [ pixels[r*ncols:(r+1)*ncols] for r in range(nrows) ]
    >>> cols = zip(*rows)
    >>> avgrow = map(lambda c: float(sum(c))/float(nrows), cols)
    visuellement, la ligne moyenne a la t�te suivante (valeurs de avgrow en fonction de l'index 0 --> nbcols-1):



    Dur de rater les images origine ...

    Ensuite, �liminer les bords droit et gauche et ne s'occuper que de la partie centrale pour d�terminer une colonne pas trop sotte � utiliser (� coup de filtres simplistes, de max ou alors de pentes).


    @ysahel : ce serait bien de ne pas distiller au compte-gouttes tes conditions d'obtention des images. On n'apprend qu'� la fin qu'elles ne sont pas forc�ment rectangulaires, etc... autant donner ces infos d�s le d�but non ? Grrrh ...

  16. #16
    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
    Un exemple sur l'image donn�e josmiley ?

  17. #17
    Membre Expert 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 : 60
    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
    Par d�faut
    Citation Envoy� par PauseKawa
    Un exemple sur l'image donn�e josmiley ?
    Une ligne moyenne sur l'image r�sultat ?

  18. #18
    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
    Oui : Je ne pratique pas pygame mais je suis int�ress� de voir du code permettant de trouver la ligne moyenne.

  19. #19
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 069
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 069
    Par d�faut
    en filtrant le r�sultat via la variable aire_mini, j'ai de bons r�sultats avec cette image:


    aire_mini est la surface minimum de chaque image extraite.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    aire_mini = 100
    marge = 10
     
    from pygame import *
    img = image.load('fleurs-minis.jpg')
    scr = display.set_mode(img.get_size())
    scr.blit(img,(0,0))
    msk = mask.from_threshold(img,img.get_at((0,0)),(marge,marge,marge,255))
    msk.invert()
    for r in msk.get_bounding_rects():
        if r.w*r.h >= aire_mini: draw.rect(scr,Color('red'),r,2)
    display.flip()
    while event.wait().type != QUIT: pass
    je rappelle que les cadres rouges ne servent qu'� visualiser les parties de l'image retenues pas le code.

  20. #20
    Membre Expert 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 : 60
    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
    Par d�faut
    Le code pour calculer la ligne moyenne est donn� dans le post#15. Ni plus, ni moins.

    Les lignes moyennes calcul�es sur les images en entr�e et en sortie du code de Josmiley :



    Apr�s, une fois connues les conditions de d�part (re-Grrrh), c'est sur qu'il faut aborder le probl�me diff�remment !

+ R�pondre � la discussion
Cette discussion est r�solue.
Page 1 sur 2 12 Derni�reDerni�re

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