2010-03-11 34 views
8

Quiero encontrar el color más usado en una imagen usando python. por ejemplo detectar el color del objeto en la siguiente imagendetectar el color más usado en una imagen usando python

http://www.shopcrazy.com.ph/wp-content/images/2007/02/shiny-bags-01.jpg.

cómo detectar el color base de los códigos RGB (por ejemplo, rojo en la imagen de arriba).

+0

Consulte http://stackoverflow.com/questions/2270874/image-color-detection-using-python/2271013#2271013 – luc

Respuesta

5

Dado que es muy probable que no va a querer un histograma de todos los millones de colores que son posibles utilizando un espacio de color de 24 bits, sugiero transformar la imagen en el espacio HSV lugar. Luego puedes dividir la parte Hue de ese espacio en varios contenedores que describen los tonos que deseas encontrar ("rojo oscuro", "rojo anaranjado", o lo que sea). Luego haz un histograma de estos contenedores y encuentra cuál es el tono dominante, que es el "color".

artículo de Wikipedia http://en.wikipedia.org/wiki/HSL_and_HSV debería empezar. SI está utilizando una biblioteca de procesamiento de imágenes es probable que exista una función rgb-hsv/hsl.

Además, si las imágenes son grandes y la velocidad es un problema, usted podría considerar la reducción de la resolución de la imagen a un tamaño menor antes de histogramas.

+0

Un buen consejo, aunque solo en H usted no puede ver la diferencia entre el rojo oscuro y el rosa, por ejemplo. – AVB

+0

Es cierto. Pero supongo que es más fácil dividir contenedores en función de H y S, en lugar de particionar R, G y B :) –

+1

cómo convertir la imagen a HSV usando el código python? –

3

El enfoque de fuerza bruta consiste en recorrer todos los píxeles de la imagen y mantener el recuento de los valores R, G, B. Un enfoque más refinado es usar la función de histograma Python Image Library y calcular el promedio de todos los colores.

+0

Puede ser suficiente tomar una muestra aleatoria de los píxeles y contarlos. –

1

Si realmente está seguro de que siempre tendrá un solo color dominante (sin bolsas en dos colores, por ejemplo), entonces un histograma crudo en las dimensiones H & S de HSV debería ser suficiente.

De lo contrario, puede (y debe) utilizar mean shift. Es bastante simple, hace exactamente lo que quieres, y hay bibliotecas que puedes usar, aunque no pude encontrar nada en Python. Puede implementarlo o llamar al código C++.

La idea básica del algoritmo es la siguiente: cada píxel se ve en los píxeles cercanos de color similar, y cambia su color a la media ponderada de todos los colores; enjuague y repita. Muy pronto tienes todos los colores en la imagen agrupados muy apretados alrededor de unos pocos colores predominantes.

0

Ordene los píxeles en el lugar, luego recorra la imagen y encuentre la ejecución más larga.

+0

-1: Esto no producirá buenos resultados para imágenes naturales. Dado un espacio de color de 24 bits, tienes 16 millones de colores. Una foto grande tiene quizás 10 millones de píxeles, lo que significa que hay una gran posibilidad de que cada píxel tenga un color único. Sin umbrales, no creo que esto dé el resultado esperado. –

+0

Respondí la pregunta como se me había pedido: si el problema no está bien establecido, vota por el problema, no por la solución. Además, su afirmación de que un píxel de 10M tiene una posibilidad sustancial de que cada píxel tenga un color único es totalmente erróneo. Solo necesitas 12-13 mil píxeles aleatorios para que la probabilidad sea menor que 1%, y 10M da una posibilidad de muchos órdenes de magnitud más pequeña. –

0

Como se sugiere, será más útil convertir su imagen de RGB a HSV. El módulo de biblioteca estándar colorsys contiene la función rgb_to_hsv a tal efecto. Luego, puede asignar colores a una imagen, digamos con H como xy S como y. Selecciona puntos en ese espacio y dales nombres; cuantos más puntos, mejor. Luego, para cada píxel en su imagen, encuentre el más cercano de los puntos que seleccionó y use su nombre como valor de píxel. Cuente qué nombre aparece la mayoría de las veces.

¿Desea que le proporcione el código?

2

Usaría la biblioteca de imágenes de Python. Esta es una pieza de código que calcula el número de píxeles blancos/píxeles no blancos en una imagen.

import sys 

from PIL import Image 

im = Image.open(sys.argv[1]) 
white = 0 
black = 0 
for i in im.getdata(): 
    if i == (255,255,255): 
    white += 1 
    else: 
    # we assume black everything that is not white: 
    black += 1 
print im.size[0],im.size[1],white,black 

En su caso, me gustaría hacer un diccionario para mantener a cada triple RGB contra un mostrador, así que reelaborar el programa como este (no probado)

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 

Ahora puede comprobar la con el recuento más alto y obtener el triple de rgb más utilizado. Por supuesto, si desea verificar también los colores vecinales, deberá convertir a HSV y verificar las distancias entre los diferentes puntos HSV, y luego decidir qué distancia es demasiado. Los puntos suficientemente cercanos en el espacio HSV (y en particular el componente hue) son muy probablemente del mismo color y, en consecuencia, pueden sumarse.

Cuestiones relacionadas