2009-11-10 15 views
5

Supongamos que hay 10.000 imágenes JPEG, PNG en una galería, ¿cómo encontrar todas las imágenes con paletas de colores similares a una imagen seleccionada ordenada por similitud descendente?Buscar imágenes con una paleta de colores similar con Python

+2

Posible duplicado: http://stackoverflow.com/questions/593925/how-do-i-find-images-with-a -similar-color-using-python-and-pil – ChristopheD

+0

Sí, pero no hay buenas respuestas sobre esa pregunta. :-) –

+0

Hay mucha discusión similar aquí: http://stackoverflow.com/questions/1034900/near-duplicate-image-detection/1048723#1048723 – Paul

Respuesta

10

Genere un histograma de color para cada imagen. Luego, cuando desee hacer coincidir una imagen con la colección, simplemente ordene la lista por la proximidad de su histograma al histograma de su imagen seleccionada.

La cantidad de depósitos dependerá de la precisión que desee. El tipo de datos combinados para crear un segmento definirá la forma de priorizar su búsqueda.

Por ejemplo, si usted está más interesado en el tono, entonces se puede definir en qué cubeta su cada pixel individual de la imagen entra en como:

def bucket_from_pixel(r, g, b): 
    hue = hue_from_rgb(r, g, b) # [0, 360) 
    return (hue * NUM_BUCKETS)/360 

Si también desea un matcher general, entonces se puede selecciona el cubo según el valor RGB completo.

Usando PIL, puede usar la función incorporada histogram. Los histogramas de "cercanía" pueden calcularse utilizando cualquier medida de distancia que desee. Por ejemplo, una distancia L1 podría ser:

hist_sel = normalize(sel.histogram()) 
hist = normalize(o.histogram()) # These normalized histograms should be stored 

dist = sum([abs(x) for x in (hist_sel - hist)]) 

una L2 sería:

dist = sqrt(sum([x*x for x in (hist_sel - hist)])) 

Normalize solo fuerza a la suma del histograma para igualar algún valor constante (1.0 funciona bien). Esto es importante para que las imágenes grandes se puedan comparar correctamente con las imágenes pequeñas. Si va a usar distancias L1, entonces debe usar una medida L1 en normalize. Si L2, entonces L2.

+0

@Frank, gracias por su consejo. ¿Me podría dar algún código de ejemplo en Python? La función de histograma incorporado (PIL) devuelve una lista, ¿cómo determinar qué tan cerca están los histogramas de dos imágenes? – jack

+0

@Frank, parece que requiere 10.000 cálculos de distancia al elegir imágenes con un histograma similar de 10.000 candidatos. ¿Es posible asociar valores numéricos con cada imagen y almacenarlos en la base de datos, por lo que la comparación se puede simplificar con algunas consultas SQL? – jack

+0

@jack, 10,000 calcs no es realmente tan caro. La mejor manera de acelerar un código como este no es reducir los histogramas en enteros (lo que no se puede hacer de la manera que crees) sino simplemente ** almacenar en caché ** los resultados. Guarde en caché el orden de clasificación (por imagen) en la base de datos o almacénelo en la memoria caché. Asegúrese de almacenar también el histograma en la base de datos o en la memoria para que reconstruir esos cachés de orden no sea costoso. –

Cuestiones relacionadas