He estado jugando a hacer mosaicos de imágenes. Mi script toma una gran cantidad de imágenes, las reduce a un tamaño de miniatura y luego las usa como mosaicos para aproximar una imagen de destino.
El enfoque es realmente bastante agradable:
Calculo el error cuadrático medio para cada pulgar en cada posición de mosaico.
Al principio, solo usé una ubicación codiciosa: coloque el pulgar con el menor error en el mosaico que mejor se ajuste, y luego el siguiente y así sucesivamente.
El problema con codicioso es que eventualmente te deja colocando los pulgares más diferentes en las fichas menos populares, ya sea que coincidan o no. Muestro ejemplos aquí: http://williamedwardscoder.tumblr.com/post/84505278488/making-image-mosaics
Entonces hago intercambios aleatorios hasta que el script se interrumpe. Los resultados están bastante bien.
Un intercambio aleatorio de dos mosaicos no siempre es una mejora, pero a veces una rotación de tres o más mosaicos da como resultado una mejora global, es decir, A <-> B
puede no mejorar, pero A -> B -> C -> A
1
puede ...
Por esta razón, después de elegir dos fichas aleatorias y descubrir que no mejoran, elijo un montón de fichas para evaluar si pueden ser la tercera ficha en esa rotación. No exploro si cualquier conjunto de cuatro mosaicos se puede rotar de manera rentable, y así sucesivamente; eso sería súper costoso muy pronto.
Pero esto lleva tiempo. ¡Mucho tiempo!
¿Existe un enfoque mejor y más rápido?
Bounty Update
Probé varias implementaciones de Python y enlaces del método húngaro .
Por mucho, el más rápido fue el Python puro https://github.com/xtof-durr/makeSimple/blob/master/Munkres/kuhnMunkres.py
Mi presentimiento es que esto se aproxima a la respuesta óptima; cuando se ejecuta en una imagen de prueba, todas las demás bibliotecas estuvieron de acuerdo con el resultado, pero este kuhnMunkres.py, aunque fue mucho más rápido, solo se acercó mucho al puntaje que acordaron las otras implementaciones.
La velocidad depende mucho de los datos; Mona Lisa se apresuró a través de kuhnMunkres.py en 13 minutos, pero el Perico Escarlata Escarlata tardó 16 minutos.
Los resultados fueron muy similares a los intercambios y rotaciones aleatorias para el periquito:
(kuhnMunkres.py a la izquierda, intercambios aleatorios a la derecha; imagen original para comparar )
Sin embargo, para la imagen de Mona Lisa con la que probé, los resultados mejoraron notablemente y en realidad hizo que su 'sonrisa' definida brillara:
(kuhnMunkres.py a la izquierda, intercambios aleatorios a la derecha)