estoy tratando de calcular la similitud (léase: distancia Levenshtein) de dos imágenes, utilizando Python 2.6 y PIL.la comparación de imágenes (similares) con Python/PIL
Planeo nosotros e la biblioteca python-levenshtein para una comparación rápida.
pregunta principal:
¿Qué es una buena estrategia para la comparación de imágenes? Mi idea es algo así como:
- Convertir a RGB (transparente -> blanco) (o tal vez convertir a blanco y negro?)
- Escala hasta el más pequeño al tamaño de la mayor
- Convertir cada canal (= el único canal, si se convierte a monocromo) a una secuencia de (valor del artículo = valor de color del píxel)
- calcular la distancia Levenshtein entre las dos secuencias
Por supuesto, esto no va a manejar los casos como Reflejé magos, imágenes recortadas, etc. Pero para una comparación básica, esto debería ser útil.
¿Existe alguna estrategia mejor documentada en alguna parte?
EDIT: Aaron H tiene razón sobre el problema de la velocidad. El cálculo de Levelshtein toma casi una eternidad para imágenes más grandes que unos cientos por algunos cientos de píxeles. Sin embargo, la diferencia entre los resultados después de la reducción de escala de 100x100 y 200x200 es inferior a 1% en mi ejemplo, por lo que podría ser conveniente establecer un tamaño de imagen máximo de ~ 100 px o así ...
EDIT: Gracias PreludeAndFugue, esa pregunta es lo que estaba buscando.
Por cierto, la distancia de Levenshtein puede optimizarse, parece, pero me está dando resultados realmente malos, tal vez porque hay muchos elementos redundantes en los fondos. Tengo que mirar algunos otros algoritmos.
EIDT: La desviación cuadrática media de la raíz y la relación pico señal/ruido parecen ser otras dos opciones que no son muy difíciles de implementar y aparentemente no son muy costosas para la CPU. Sin embargo, parece que voy a necesitar algún tipo de análisis de contexto para reconocer formas, etc.
De todos modos, gracias por todos los enlaces, y también por señalar la dirección hacia NumPy/SciPy.
No puedo responder directamente, pero sospecho que debido a la pérdida de precisión de los datos en la ampliación, tendrá mucha "distancia" entre los dos, donde reducir la escala más grande puede dar como resultado relación más cercana entre los dos. - En cuanto a la distancia de Levenshtein, no tengo idea, pero esta cita de Wikipedia me hace escéptico en cuanto a su utilidad en esta aplicación: "La distancia de Levenshtein también se puede calcular entre dos cadenas más largas, pero el costo de calcularla, que es aproximadamente proporcional al producto de las dos longitudes de cuerda, lo hace poco práctico ". –
Esta pregunta puede ayudar: http://stackoverflow.com/questions/613146/computing-the-difference-between-images –
Además, convierta la imagen PIL a numpy array para realizar la manipulación matemática. Numpy está diseñado para manipular grandes matrices de datos numéricos. Esta pregunta muestra el procedimiento: http://stackoverflow.com/questions/384759/pil-and-numpy –