7

Según las sugerencias aquí @ SO, he catalogado el color promedio para un conjunto de imágenes de stock.
r, g, b = image.convert ("RGB"). Cambiar el tamaño de ((1,1), Image.ANTIALIAS) .getpixel ((0,0))Buscar imágenes de color similar

Ahora, me gustaría presentar una rueda de color para el usuario y ejecutar una búsqueda en mi catálogo para encontrar las imágenes que coinciden más con el color seleccionado.

He leído varias preguntas publicadas aquí que recomiendan "encontrar la distancia entre dos colores", y hacen referencia al libro de Flickr Hacks.

El algoritmo de distancia Flickr Hack parece ser básicamente:


diffr = checkImage.r - search_r
diffg = checkImage.g - search_g
diffb = checkImage.b - search_b
distancia = (diffr * diffr + diffg * diffg + diffb * diffb)
si la distancia < coincide con el umbral.


Este método me requerirá calcular la distancia entre el color de búsqueda y la huella digital en color de cada imagen. Me preguntaba si hay alguna manera de especificar de alguna manera un "área de búsqueda" basada en el color seleccionado (punto central) y un umbral predeterminado (o radio de búsqueda). Luego construya una consulta similar a SQL para devolver todas las imágenes que caen dentro de esta área.

¿Es esto posible?

BTW, estoy implementando esto en Python usando PIL y bibliotecas relacionadas.

Gracias por su ayuda SO!

SR

+0

¿Ha encontrado lo que buscabas? – Thariama

Respuesta

2

Puede ahorrar significativamente en el cálculo haciendo comparaciones en cada componente en lugar de cuadrar para encontrar la distancia.

if abs(check.r - search.r) < threshold and 
    abs(check.g - search.g) < threshold and 
    abs(check.b - search.b) < threshold 

Combinando esto con tablas de caché, probablemente será suficiente para lo que está haciendo.

+0

Esta es una búsqueda de cuadro, la suma de cuadrados en el OP es una prueba esférica. Dudo que exista alguna diferencia entre los dos métodos en cuanto a velocidad (tres multiplicaciones de 8 bits, tres, tres, suma y abs), es la mayor sobrecarga, como sucede con la mayoría de las cosas en estos días, es el ancho de banda de la memoria. – Skizz

+0

Fácilmente el enfoque más simple, y estoy esperando desesperadamente que produzca resultados utilizables. ¡Gracias! Lo intentaré en breve y publicaré mis resultados. oí una vez en un video de TED que el aficionado se había alcanzado el 80% de la funcionalidad de los productos comerciales en alrededor de 2% del costo. Me encanta esa mentalidad, y su lo que estoy apuntando con mi proyecto: si la búsqueda visual del color no será perfecto, pero si su mayoría allí con unas cuantas horas de esfuerzo, que será fresco montón ya! SR –

1

Si fuera yo, me gustaría ir un poco menos de fantasía y la memoria caché las búsquedas en una tabla secundaria, como:

CREATE TABLE `image_search` (
    `id` int not null auto_increment, 
    `image_id` int not null, 
    `r` tinyint not null, 
    `g` tinyint not null, 
    `b` tinyint not null, 
    `distance` tinyint not null, 
    `hit` bool not null, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `image_id_by_rgb_by_distance` (`image_id`,`r`,`g`,`b`,`distance`), 
    KEY `image_id_by_rgb_by_distance_by_hit` (`image_id`,`r`,`g`,`b`,`distance`,`hit`), 
); 

tirar de que para encontrar sus partidos, como

SELECT `image_id` 
FROM `image_search` 
WHERE `r` = $r 
AND `g` = $g 
AND `b` = $b 
AND `distance` = $distance 
AND `hit` = 1 

Si no se obtienen resultados, y luego hacer

SELECT `image_id` 
FROM `image_search` 
WHERE `r` = $r 
AND `g` = $g 
AND `b` = $b 
AND `distance` = $distance 

y si no hay resultados en que, luego ejecute su catálogo de imágenes haciendo la comparación y almacene cada resultado, positivo o negativo, en la tabla.

Entonces solo será lento cuando no tenga los resultados en la memoria caché. Si su UI alienta al usuario a seleccionar ciertos colores preestablecidos útiles, puede calcularlos previamente y ayudar aún más.

También puntos de bonificación para precomputar todas las búsquedas ejecutadas previamente cuando agrega una imagen a su catálogo.

+0

caos, si lo entiendo correctamente, está sugiriendo que haga el análisis de comparación por adelantado y almacene las relaciones en el DB. Entonces, para cada color, ya tendría una lista de imágenes que son similares, y la operación sería una búsqueda simple. Eso es bastante simple, y realmente muy inteligente, voy a intentarlo. Sin embargo, esto sólo sería útil si el punto de inicio de la búsqueda era una imagen ya en mi catálogo. Calcularía su color medio, luego probaría mi búsqueda. Quiero presentar una rueda de colores y presentar las mejores coincidencias para un color seleccionado. ¿Alguna idea? –

+0

Es por eso que estoy hablando de esto principalmente como un mecanismo de almacenamiento en caché. Si la combinación de color/distancia no está en la tabla, entonces la calcula y almacena. La precomputación solo se usa para inicializar la memoria caché con valores que usted sabe que los usuarios probablemente seleccionen. – chaos

0

Podemos mirar a un color como un punto en el espacio tridimensional. Ahora cada imagen estará en un punto en el espacio definido por su color promedio. El usuario elige un punto en el espacio 3-d y desea encontrar la imagen más cercana a ese punto.

Esto no es simple, pero una gran cantidad de trabajo se ha realizado sobre él por la gente más inteligente que tú o yo (Don Knuth llama el 'problema de correo'). Un buen lugar para comenzar es at Wikipedia, como de costumbre.

Cuestiones relacionadas