J'ai joué avec des mosaïques d'images. Mon script prend un grand nombre d'images, les réduit à la taille des vignettes, puis les utilise comme tuiles pour approximer une image cible.
L'approche est en fait assez agréable:
Je calcule l'erreur quadratique moyenne pour chaque pouce dans chaque position de tuile.
Au début, je viens d'utiliser un placement gourmand: mettre le pouce avec le moins d'erreur sur la tuile qui lui convient le mieux, puis la suivante et ainsi de suite.
Le problème avec les gourmands est qu'il vous laisse finalement placer les pouces les plus différents sur les tuiles les moins populaires, qu'elles correspondent étroitement ou non. Je montre des exemples ici: http://williamedwardscoder.tumblr.com/post/84505278488/making-image-mosaics
Je fais donc des échanges aléatoires jusqu'à ce que le script soit interrompu. Les résultats sont tout à fait corrects.
Un échange aléatoire de deux tuiles n'est pas toujours une amélioration, mais parfois une rotation de trois tuiles ou plus entraîne une amélioration globale, c'est A <-> B
-à- dire peut ne pas s'améliorer, mais A -> B -> C -> A
1
peut ..
Pour cette raison, après avoir choisi deux tuiles aléatoires et découvert qu'elles ne s'améliorent pas, je choisis un tas de tuiles pour évaluer si elles peuvent être la troisième tuile dans une telle rotation. Je n'explore pas si n'importe quel ensemble de quatre tuiles peut être tourné de manière rentable, et ainsi de suite; ce serait très cher très bientôt.
Mais cela prend du temps .. Beaucoup de temps!
Existe-t-il une approche meilleure et plus rapide?
Mise à jour Bounty
J'ai testé différentes implémentations et liaisons Python de la méthode hongroise .
De loin le plus rapide était le https://github.com/xtof-durr/makeSimple/blob/master/Munkres/kuhnMunkres.py pur-Python
Mon intuition est que cela se rapproche de la réponse optimale; lorsqu'il est exécuté sur une image de test, toutes les autres bibliothèques sont d'accord sur le résultat, mais ce kuhnMunkres.py, tout en étant plus rapide de plusieurs ordres de grandeur, n'est devenu très très très proche du score que les autres implémentations convenues.
La vitesse est très dépendante des données; Mona Lisa s'est précipitée à travers kuhnMunkres.py en 13 minutes, mais la Perruche à poitrine écarlate a pris 16 minutes.
Les résultats étaient sensiblement les mêmes que les échanges et rotations aléatoires pour la perruche:
(kuhnMunkres.py à gauche, swaps aléatoires à droite; image originale pour comparaison )
Cependant, pour l'image de la Joconde avec laquelle j'ai testé, les résultats ont été sensiblement améliorés et elle avait en fait son «sourire» défini qui brillait:
(kuhnMunkres.py à gauche, swaps aléatoires à droite)