2009-06-12 19 views
7

Estoy tratando de construir una utilidad como esta http://labs.ideeinc.com/multicolr, pero no sé qué algoritmo están usando, ¿Alguien sabe?Algoritmo de búsqueda de similitud visual

+0

No estoy seguro de que sea una detección de "similitud visual", más parecida a la indexación del color (colores y área compartida). Como el color está hecho de componentes numéricos, puede construir algoritmos para rastrearlo. –

Respuesta

5

Todo lo que hacen es coincidir histogramas.

Así que construya un histograma para sus imágenes. Normalice los histogramas por tamaño de imagen. Un histograma es un vector con tantos elementos como colores. No necesita 32,24, y tal vez ni siquiera 16 bits de precisión, y esto solo lo hará más lento. Por motivos de rendimiento, correlacionaría los histogramas a 4, 8 y 10-12 bits.

  • Haz un difuso least distance compare entre todos los histogramas de 4 bits y los colores de muestra.
  • Luego tome ese conjunto y compare el histograma de 8 bits.
  • Luego, tal vez aumente hasta un histograma de 10 o 12 bits en comparación con el conjunto restante. Esta será la búsqueda de mayor rendimiento, porque está comparando el conjunto total con un número muy pequeño de cálculos, para encontrar un subconjunto pequeño.
  • A continuación, se trabaja en el pequeño subgrupo con un mayor número de cálculos, etc.

El gran truco real es encontrar el mejor algoritmo para hacer coincidir los histogramas similares.

  • Comience con el cálculo de distancia. En 3 dimensiones, creo que fue:

    SQRT ((x1-x2)^2 + (y1-y2)^2 + (Z1-Z2)^2)

que estoy haciendo esto desde la memoria, así que búscalo para asegurarte.

  • para sus propósitos, que tendrán más de 3 dimensiones, por lo que tendrá más términos. Un histograma de 4 bits tendría 16 términos, uno de 8 bits tendría 256 términos, etc. Recuerde que este tipo de matemática es lenta, así que no haga la parte SQRT. Si normalizas el tamaño de tus imágenes lo suficientemente pequeño, digamos hasta 10,000 píxeles, entonces sabes que solo tendrás que hacer x^2 para los valores 0..10,0000. Precalcular una tabla de búsqueda de x^2 donde x pasa de 0..10,000. Entonces tus cálculos irán rápido.

  • Cuando selecciona un color de la paleta, simplemente haga un histograma con ese color = 10,0000. Cuando seleccione 2, crea un histograma con color1 = 5000, 5000 color2 = etc.

  • Al final tendrá que añadir factores de dulce de azúcar para hacer la aplicación coincide con el mundo real, pero se puede encontrar estos con las pruebas.

+0

gracias usaré imageJ y este algoritmo de programa http://rsb.info.nih.gov/ij/plugins/color-inspector.html – Emrah

+0

Menciono hacer una comparación de distancia mínima difusa. Creo que estaba drogado. Simplemente compara la distancia mínima. :) – johnnycrash

0

Probablemente simplemente creando un histograma de los colores utilizados en las imágenes, y luego haciendo un mejor ajuste a los colores seleccionados por el usuario.

2

Te sugiero que hagas algún tipo de agrupación de los colores presentes en las imágenes en su base de datos.Es decir, para cada imagen en su base de datos:

  • recoger los colores de cada píxel de la imagen
  • realizar el agrupamiento (digamos k-media agrupación con 5 grupos) en los colores recogidos
  • tienda de la colores agrupados como descriptor representativa de la imagen

Cuando el usuario proporciona un conjunto de uno o más colores de consulta que hacer algún tipo de juego codicioso elegir la mejor combinación entre los colores dados y el descriptor de color (los 5 colores reprsentative) de cada imagen en su base de datos .

¿Cuál es el tamaño de la colección de imágenes, ya que dependiendo del tamaño, la indexación de algunas búsquedas puede ser un problema mayor que el alogorito mismo?