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

Traitement d'images Discussion :

nombre couleurs d'une image


Sujet :

Traitement d'images

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Chypre

    Informations forums :
    Inscription : Août 2012
    Messages : 43
    Points : 29
    Points
    29
    Par défaut nombre couleurs d'une image
    hello,
    je veux calculer le nombre de couleurs d'une image, quelle est la meilleure façon de le faire ???

  2. #2
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Qu'appelles-tu le nombre de couleur d'une image ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Chypre

    Informations forums :
    Inscription : Août 2012
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    si par exemple dans l'image il n y a que des pixels noirs et blancs alors le nombre de couleurs est 2, bref on suit ce raisonnement

  4. #4
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Bien...
    Ce que je peux te proposer c'est de parcourir toute l'image, et à chaque pixel d'une nouvelle couleur, la stocker dans un coin et incrémenter un compteur de couleur.

    C'est un algo en O(N) en temps (avec N le nombre de pixels). Et en O(P) en espace, avec P le nombre de couleur de ton image. Ce qui peut faire 16777216 sur une image RGB avec 256 niveaux par canal. Ce qui peut facilement monter à 100Mo de mémoire consommée sur une implémentation naïve.

    Un autre algo que je peux te proposer c'est de traiter ton image comme un tableau 1D et de trier les pixels de ton image par valeur (à toi de choisir la relation d'ordre que tu veux). Ensuite tu n'as plus qu'à reparcourir ton image triée et compter le nombre de transition de couleur.

    Cet algo est en O(N log N) en temps, et en O(N) en espace.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Chypre

    Informations forums :
    Inscription : Août 2012
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    merci, en effet j'ai posée la question à cause de la complexité et le temps du calcul, pouvez m'expliquer ta solution car je ne l'ai pas bien comprise

  6. #6
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Quelle solution n'as-tu pas compris ? Je t'en ai proposé 2.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Chypre

    Informations forums :
    Inscription : Août 2012
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    la deuxieme

  8. #8
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Bien :
    1) Trier les pixels de ton image par valeur. Cela va avoir le bon goût de les regrouper par valeurs identique.
    2) Parcourir tous les pixels de ton image pour déterminer le nombre de "zone" de couleur uniforme.

  9. #9
    Membre éclairé
    Homme Profil pro
    Ingénieur R&D en apprentissage statistique
    Inscrit en
    Juin 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur R&D en apprentissage statistique

    Informations forums :
    Inscription : Juin 2009
    Messages : 447
    Points : 752
    Points
    752
    Par défaut
    Comme il ne peut pas y avoir plus de couleurs différentes que de pixels dans l'image (au pire on a une couleur différente par pixel donc P<=N), une implémentation de la première méthode basée par exemple sur une table de hashage, devrait toujours être plus intéressante en complexité temporelle et spatiale que la deuxième, non ?

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Chypre

    Informations forums :
    Inscription : Août 2012
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    merci pour les réponses,
    la taille des images que je manipule est fixe : 128x128, dois je utiliser un tabelau statique ou une liste dynamique ???

  11. #11
    Nouveau membre du Club
    Inscrit en
    Mai 2012
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 51
    Points : 27
    Points
    27
    Par défaut
    Quelque soit la méthode utilisé, ça ne sera fatalement pas du O(n), avec n le nombre de pixel.

    La méthode que j'utiliserais (sans doute pas le mieux, mais facilement implémentable, et relativement efficace) :

    Tu crées une liste vide de couleur (genre une liste de String avec des valeurs comme "FF0000" pour le rouge).

    Tu parcours ton image (matrice), et pour chaque élément, tu as 2 possibilités :
    1- Cette couleur n'est pas présente dans ta liste créée par tes soins => Tu l'ajoutes dans la liste.
    2- Cette couleur est présente dans la liste => tu fais rien.

    Quand c'est fini, tu regarde simplement le nombre d'élément de ta liste, et en plus de ça, tu as la liste exhaustive des couleurs présentes dans ton image.

    Pour voir si l'élément est présent dans la liste, tu peux faire un taListe.contain(taCouleur) si c'est du Java que tu utilises.

    Donc tu ne parcours qu'une seule fois ta matrice, mais vu que tu parcours ta liste sans arrêt, j'ai un doute sur le fait que ce soit du O(n).

    PS : j'ai pas suivi de cours sur les complexités, dont je dis peut être une énorme ********.

    Ca me parait en tout plus simple à implémenter et moins gourmand que la méthode de tri qui est déjà facilement en O(n*log(n)) suivant la méthode utilisée

  12. #12
    Membre éclairé
    Homme Profil pro
    Ingénieur R&D en apprentissage statistique
    Inscrit en
    Juin 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur R&D en apprentissage statistique

    Informations forums :
    Inscription : Juin 2009
    Messages : 447
    Points : 752
    Points
    752
    Par défaut
    @marko quel langage utilises-tu ?

    @Tiffado, l'utilisation d'une hash map permet l'accès à un élément en O(1), donc on a bien un algo en O(n).

    En supposant que l'image est donnée sous forme de tableau numpy en python on aurait:

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    def count_colors(image):
        colors = {}
        height, width = image.shape
        for i in range(height):
            for j in range(width):
                 c = tuple(image[i,j])
                 if colors.has_key(c):
                     colors[c] += 1
                 else:
                     colors[c] = 1
        return colors

    Edit:

    1) La complexité O(1) est théorique si on a une bonne fonction de hashage.
    2) Il me semble qu'il existe HashMap en Java et unordered_map en C++0x pour les tableau associatifs.

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Chypre

    Informations forums :
    Inscription : Août 2012
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    merci pour les réponses,
    j'utilise Delphi, est ce que les hash map existent en Delphi ? ou autre structure equivalente ?

  14. #14
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Citation Envoyé par Alexis.M Voir le message
    Comme il ne peut pas y avoir plus de couleurs différentes que de pixels dans l'image (au pire on a une couleur différente par pixel donc P<=N), une implémentation de la première méthode basée par exemple sur une table de hashage, devrait toujours être plus intéressante en complexité temporelle et spatiale que la deuxième, non ?
    Avec une table de hashage, y'a toujours un facteur chance. Puisque quelque soit la fonction de hashage, la complexité d'un ajout ou d'une recherche peut être en O(M).
    On a donc du O(N) en moyenne et du O(N*M) au pire. (Avec N le nombre de pixels, et M le nombre de couleurs distinctes.)

    Si on remplace la table de hashage par une structure de données plus déterministe comme un arbre équilibré, cette méthode passe en O(N * log(M)) en moyenne, idem au pire.

    En espace ça reste du O(M).

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

Discussions similaires

  1. [Débutant] nombre de couleurs dans une image
    Par amal1410 dans le forum Images
    Réponses: 1
    Dernier message: 25/04/2013, 09h37
  2. Réponses: 7
    Dernier message: 30/06/2010, 16h56
  3. [Cross-Browser] Couleur d'une image PNG
    Par [BkM-) dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 17/11/2005, 21h00
  4. [Image]Nombre de couleur d'une image
    Par daxuza dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 05/09/2005, 08h14
  5. [Graphique] Comment compter les couleurs d'une image ?
    Par yoghisan dans le forum API, COM et SDKs
    Réponses: 27
    Dernier message: 16/02/2005, 18h17

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