2010-07-19 18 views
8

Tengo una cantidad bastante grande de fotos y un mapa de color RGB (digamos de aproximadamente 100 colores). ¿Cómo puedo agrupar las imágenes por color y obtener algo como lo siguiente: http://labs.ideeinc.com/multicolr?Fotos de grupo por color

Mi idea actual es la siguiente: El uso de ImageMagick, hacer esto para cada foto:

  1. cambiar su tamaño a un tamaño más pequeño para que se pueda procesar más rápido.
  2. Quantize sin oscurecimiento utilizando el mapa de colores elegido.
  3. Obtenga la foto histogram para obtener la cantidad de veces que aparece cada color.
  4. Almacene los colores en una base de datos, pero no he descubierto cuál es la mejor manera de hacerlo para recuperarlos rápidamente.

¿Conoces alguna forma mejor y más eficiente para hacer esto? Mi lenguaje de elección es PHP ya que todo el procesamiento pesado será realizado por ImageMagick, y la base de datos es PostgreSQL. ¡Gracias de antemano!

Respuesta

1

Me di cuenta de que ya descubrió cómo obtener los colores más relevantes de la imagen. No cambie el tamaño de las imágenes porque el histograma puede ser diferente.

La base de datos puede ser algo como lo siguiente:

tabla de imagen:

image_id | image_file 

tabla de colores:

color_id | color_rgb 

mesa image_color: Columna color_percent

image_id | color_id | color_percent 

w enfermo ser utilizado para la agrupación/donde cláusulas

imágenes Obtención:

select 
    image_id 
    sum(color_percent)/count(color_percent) as relevance 
from 
    image_color 
where 
    color_id IN (175, 243) # the colors you want to involve in this search 
    and color_percent > 10 # this will drop results with lower significance 
group by 
    image_id 
order by 
    relevance 
+0

Creo que el color_id es un poco más. Si solo está haciendo referencia a un color_rgb, no creo que necesite una clave por separado. – rfusca

+0

o podría hacer referencia al nombre del color –

+0

Voy a marcar esto como la respuesta aceptada, porque esto es lo que terminé haciendo. No es perfecto, pero me gusta y fue muy divertido de hacer. :) Échale un vistazo: http://www.picof.net/colors/. Problemas: No sé cómo seleccionar fotos con más de un color y ordenarlas por algo significativo. Intenté ordenarlos por (color_A_percent + color_B_percent + ...) pero luego termino obteniendo fotos que tienen 99% color_A y 1% color_B. – liviucmg

1

colores son esencialmente tres vectores tridimensionales (sin importar si se representan como HSV, RGB, CMY [K]). Lamentablemente, la base de datos relacional no es muy buena para trabajar en más de 1 dimensión.

Si reduce la imagen a un solo color "promedio", la solución se vuelve un poco más simple: Un análisis trivial implicaría que tendría que comparar una nueva imagen con cada imagen existente para determinar el nivel de similitud . Sin embargo, un mejor enfoque sería digitalizar el vector para encontrar valores similares en la base de datos.

p. Ej. para el color 124, 39, 24 bits 201 como 1 bit de color: 0,0,1 como 2 bits de color: 1,0,2 ....

Si desea ver más colores en la imagen, entonces recomiendo reducir hasta los valores más cercanos de un mapa de color fijo sin propagación de errores e identificar los mejores 'N' colores utilizados con mayor frecuencia. Lo que haga después de eso requerirá un poco de prueba y esfuerzo: el método arriba ponderado para la frecuencia en la imagen intermedia podría ser necesario o simplemente podría salirse con la suya viendo las imágenes donde los mejores colores NM coinciden con NX de sus valores calculados (con algunos retoque de los valores M y X).

C.

+0

He encontrado un módulo PostgreSQL llamado "cubo" que puede tratar con índices multidimensionales: http://www.postgresql.org/docs/8.4/static/cube.html. Creo que lo intentaré. ya que debería ser posible seleccionar fotos basadas en cualquier color RGB, no solo las específicas de una paleta limitada. – liviucmg

+0

Cool - He aprendido algo nuevo. – symcbean

0

He notado lo que necesita hacer. La mejor forma de evitar ese problema es convertir su imagen de RGB a perfil de color CIE-LAB.
Luego puede calcular la distancia entre los dos colores en el espacio 3D.

M.M.

+0

¿Tiene esto ventajas en comparación con la solución Cube Postgres que el OP estableció? – FoolishSeth