9
votes

détecter la couleur la plus utilisée dans une image à l'aide de Python

Je veux trouver la couleur la plus utilisée dans une image à l'aide de Python. Par exemple, détectez la couleur de l'objet dans l'image suivante

http: // www. ShopCrazy.com.ph/wp-Content/Images/2007/02/Shiny-bags-01.jpg .

Comment détecter la couleur de base des codes RVB (exemple - rouge dans l'image ci-dessus).


6 Réponses :


3
votes

L'approche de la force brute est de boucler sur tous les pixels de l'image et de conserver le nombre de valeurs R, G, B. Une approche plus raffinée consiste à utiliser Bibliothèque d'images Python Fonction d'histogramme et calculer la moyenne de toutes les couleurs.


1 commentaires

Il peut suffire de prendre un échantillon aléatoire des pixels et de compter celles-ci.



5
votes

Étant donné que vous ne voudrez probablement pas d'histogramme de toutes les millions de couleurs possibles à l'aide d'un espace de couleur 24 bits, je suggère de transformer l'image en espace HSV à la place. Ensuite, vous pouvez séparer la partie de cet espace dans un certain nombre de bacs décrivant les teintes que vous souhaitez trouver ("rouge foncé", "rouge orange", ou autre). Ensuite, faites un histogramme de ces bacs et trouvez qui est la teinte dominante, qui est la "couleur".

L'article Wikipedia http://fr.wikipedia.org/wiki/hsl_and_hsv devrait obtenir vous avez commencé. Si vous utilisez une bibliothèque de traitement d'image, des chances sont qu'une fonction RGB-TO-HSV / HSL existe.

De plus, si les images sont grandes et que la vitesse est une question, vous pouvez envisager de réduire l'image à une taille plus petite avant l'histogramme.


2 commentaires

Bon conseil, bien que sur H seul, vous ne pouvez pas voir la différence entre rouge profond rouge et rose, par exemple.


Vrai. Mais je suppose qu'il est plus facile de diviser les bacs basés sur H et S, au lieu de partitionnement r, g et b :)



1
votes

Si vous êtes vraiment sûr que vous n'ayez toujours qu'une seule couleur dominante (pas de sacs en deux couleurs, par exemple), puis un histogramme brut sur les dimensions H & S de HSV devrait suffire.

Sinon, vous pouvez (et devrait) utiliser Shift signifie . C'est assez simple, c'est exactement ce que vous voulez, et vous pouvez utiliser des bibliothèques, bien que je ne puisse rien trouver dans Python. Vous pouvez soit la mettre en œuvre, soit appeler C ++ code.

L'idée de base de l'algorithme est la suivante: chaque pixel regarde les pixels à proximité de couleur similaire et change sa couleur sur la moyenne pondérée de toutes leurs couleurs; rincer et répéter. Très bientôt, vous avez toutes les couleurs de l'image regroupées très étroitement autour de quelques couleurs prédominantes.


0 commentaires

0
votes

Trier les pixels en place, puis boucler à travers l'image et trouver la plus longue course.


2 commentaires

-1: Cela ne produira pas de bons résultats pour des images naturelles. Compte tenu d'un espace de couleur 24 bits, vous avez 16 millions de couleurs. Une grande photo a peut-être 10 millions de pixels cela signifie qu'il existe une chance assez substantielle que chaque pixel ait une couleur unique. Sans seuillage, je ne pense pas que cela donnera le résultat attendu.


J'ai répondu à la question comme demandé - si le problème est mal indiqué, votez le problème, pas la solution. De plus, votre affirmation selon laquelle un pixel de 10 m a une chance substantielle d'avoir chaque pixel une couleur unique est fausse. Vous n'avez besoin que de 12 à 13 000 pixels aléatoires pour que la probabilité soit inférieure à 1% et 10M donne une chance de nombreuses ordres de grandeur plus petit.



1
votes

Comme suggéré, il sera favorable de convertir votre image de RVB en HSV. Le module de bibliothèque standard Colorys contient la fonction rgb_to_hsv à ce sujet effet. Ensuite, vous pouvez cartographier des couleurs sur une image, dire avec h en tant que x et S comme Y. Sélectionnez des points dans cet espace et donnez-leur des noms; Plus les points, mieux c'est. Ensuite, pour chaque pixel de votre image, trouvez le plus proche des points que vous avez sélectionnés et utilisez son nom comme valeur de pixel. Compter quel nom survient la plupart des temps.

Voulez-vous que je fournisse du code?


0 commentaires

2
votes

J'utiliserais la bibliothèque d'images Python. Ceci est un morceau de code qui calcule le nombre de pixels blancs / pixels non blancs dans une image.

import sys

from PIL import Image

im = Image.open(sys.argv[1])
count= {}
for i in im.getdata():
  if not count.has_key(i):
      count[i] = 0

  count[i] += 1


0 commentaires