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 :

Opencv - Image Andy Warhol


Sujet :

Python

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 52
    Points : 47
    Points
    47
    Par défaut Opencv - Image Andy Warhol
    Bonjour à tous,

    Je suis débutante avec python mais également avec openCV du coup j'ai besoin d'un expert pour m'aider svp. J'aurais aimé avec le langage Python et OpenCV créer une image de type Andy Warhol. Le but étant d'entrer en paramètre n'importe quel image portrait et d'exécuter le programme python puis récupérer en sortie une image comme celle-ci.
    Nom : warhol.jpg
Affichages : 2079
Taille : 59,4 Ko

    Avez-vous un code pour m'aider svp car j'ai vraiment du mal avec python.

    Pour moi il y a 3 étapes à réaliser:
    - convertir la photo en 3 ou plusieurs nuances fixe noir et blanc
    - convertir les 3 nuances noir et blanc en 3 couleurs différentes (exemple : bleu - rose -blanc)
    - faire ce travail encore 8 fois avec des couleurs différentes
    - puis concaténer les 9 images entre-elles

    Avez vous une idée de code svp?

    Merci pour votre aide.

    Cordialement,

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par JOKER6 Voir le message
    Avez vous une idée de code svp?
    Google est votre ami.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 465
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 465
    Points : 9 257
    Points
    9 257
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je ne connais pas du tout opencv, mais ça m'a amusé de rentrer un peu dans le sujet.

    Si je prends l'exemple d'un seul portrait à traiter, à partir d'une vraie photo:

    - il faut faire un "détourage" de la tête par rapport au fond. Il me parait difficile de faire ça automatiquement: il faut utiliser un logiciel de retouche d'image comme photoshop ou gimp (gratuit), et s'attendre à corriger le contour à la main. On obtient ainsi la tête seule.

    - Pour traiter la tête: il faut

    --définir les 2 couleurs finales (une sombre et une claire). Par exemple bleusombre = [255,0,0] et bleuclair = [255, 170,170]. (attention: l'ordre des couleurs avec opencv est "bgr" et non le traditionnel "rgb"!).

    -- définir la limite d'éclairement du pixel en dessous de laquelle on lui donnera la couleur sombre et au dessus la couleur claire. On peut définir l'éclairement à partir des composantes du pixel en bgr comme L = (max([b,g,r])+min([b,g,r]))//2. On part de 128 et on voit s'il faut l'augmenter ou le diminuer en fonction du rendu.

    Faire ça pixel par pixel est une solution lente, mais j'imagine qu'en utilisant la syntaxe numpy et les fonctions adaptés opencv on peut aller vite.

    Pour essayer, j'ai pris une photo à moi de 150x150 pixels. Voilà mes éléments de code commentés (Python 3):

    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
    import cv2
     
    img = cv2.imread("toto1.jpg")
     
    bleusombre = [255, 0, 0]  # ordre: bgr (blue, green, red)
    bleuclair = [255, 170, 170]
     
    height, width = img.shape[:2]
    for i in range(0, height):
        for j in range(0, width):
     
            b, g, r = str(img[i,j])[1:-1].split() # <= utiliser plutôt la syntaxe numpy
            b, g, r = int(b), int(g), int(r) # <= conversion en entier
     
            lum = (max([r, g, b])+min([r, g, b]))//2
     
            if lum>=128:
                img[i,j] = bleuclair
            else:
                img[i,j] = bleusombre 
     
    cv2.imwrite('toto2.jpg', img)
    C'est vraiment un code de principe, mais avec ça, on peut chercher pour faire mieux.

    En tout cas, ça marche! Et le calcul pixel par pixel sur cette petite photo 150 x 150 prend environ 10 secondes.

    Il ne restera plus qu'à mettre cette tête colorée sur un fond de la couleur choisie, traiter les autres têtes avec les autres couleurs et assembler le tout.

    Bon courage!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 52
    Points : 47
    Points
    47
    Par défaut
    Merci Tyrtamos pour votre réponse,

    Cela m'a aidé à avoir quelques idées dans ma réalisation notamment pour remplir les couleurs. Par contre dans mon exercice des images Andy Warhol (voir image du premier message), j'ai vraiment besoin d'isoler 3 parties (le visage, le reste du corps et le background). J'ai un code qui me permet de ressortir mon portrait en noir et blanc avec des traits bien définis:
    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
     
    import cv2
    import numpy as np
     
    img = cv2.imread('mypic.jpg',0)
    img = cv2.medianBlur(img,5) #sans cela il y a plein de point noir dans l'image # uniformise les points
     
    ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
    th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
    cv2.THRESH_BINARY,11,2)
    th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
    cv2.THRESH_BINARY,11,2)
     
    images = [img, th1, th2, th3]
    cv2.imwrite("th3.png",th3)
    Maintenant il faut:
    - contourner/detecter le visage et changer le blanc du visage en 1ère couleur
    - contourner/detecter le reste du corps et changer le blanc du reste du corps en une 2ème couleur
    - contourner/detecter le background du corps et changer le blanc du background en 3ème couleur

    Je n'arrive pas à trouver quelque chose pour réaliser cela.

    Merci pour votre aide svp.

    Cordialement,

Discussions similaires

  1. [Imagick] Script transformation d'image Andy Warhol
    Par jtonnel dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 14/09/2009, 16h35
  2. Problème d'acquisition d'une image vidéo avec OpenCV
    Par erwangouyette dans le forum C++
    Réponses: 0
    Dernier message: 22/08/2008, 19h28
  3. Transformer des images OpenCV en AVI
    Par bustaja dans le forum OpenCV
    Réponses: 2
    Dernier message: 24/04/2007, 14h11
  4. Traitement d'image java OpenCV
    Par moris113 dans le forum Multimédia
    Réponses: 1
    Dernier message: 12/07/2006, 19h12
  5. [Qt]Afficher une image d'openCV dans un pixmap
    Par astragoth dans le forum Qt
    Réponses: 8
    Dernier message: 14/03/2006, 15h14

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