Ich habe mit der Herstellung von Bildmosaiken gespielt. Mein Skript nimmt eine große Anzahl von Bildern auf, verkleinert sie auf die Größe der Miniaturansichten und verwendet sie dann als Kacheln, um ein Zielbild zu approximieren.
Der Ansatz ist eigentlich recht erfreulich:
Ich berechne den mittleren quadratischen Fehler für jeden Daumen in jeder Kachelposition.
Zuerst habe ich nur eine gierige Platzierung verwendet: Legen Sie den Daumen mit dem geringsten Fehler auf die Kachel, die am besten passt, und dann die nächste und so weiter.
Das Problem mit gierig ist, dass Sie schließlich die unterschiedlichsten Daumen auf die am wenigsten beliebten Kacheln legen, unabhängig davon, ob sie genau übereinstimmen oder nicht. Ich zeige hier Beispiele: http://williamedwardscoder.tumblr.com/post/84505278488/making-image-mosaics
Also mache ich dann zufällige Swaps, bis das Skript unterbrochen wird. Die Ergebnisse sind ganz in Ordnung.
Ein zufälliger Austausch von zwei Kacheln ist nicht immer eine Verbesserung, aber manchmal führt eine Drehung von drei oder mehr Kacheln zu einer globalen Verbesserung, dh A <-> B
möglicherweise nicht verbessert, aber A -> B -> C -> A
1
möglicherweise.
Aus diesem Grund wähle ich, nachdem ich zwei zufällige Kacheln ausgewählt und festgestellt habe, dass sie sich nicht verbessern, eine Reihe von Kacheln aus, um zu bewerten, ob sie die dritte Kachel in einer solchen Drehung sein können. Ich untersuche nicht, ob ein Satz von vier Kacheln gewinnbringend gedreht werden kann, und so weiter. das wäre sehr bald super teuer.
Aber das braucht Zeit. Viel Zeit!
Gibt es einen besseren und schnelleren Ansatz?
Kopfgeld-Update
Ich habe verschiedene Python-Implementierungen und -Bindungen der ungarischen Methode getestet .
Das mit Abstand schnellste war das reine Python https://github.com/xtof-durr/makeSimple/blob/master/Munkres/kuhnMunkres.py
Meine Vermutung ist, dass dies ungefähr die optimale Antwort ist; Bei der Ausführung eines Testbilds waren sich alle anderen Bibliotheken über das Ergebnis einig, aber diese kuhnMunkres.py war zwar um Größenordnungen schneller, kam aber nur sehr nahe an die Punktzahl heran, auf die sich die anderen Implementierungen geeinigt hatten.
Die Geschwindigkeit ist sehr datenabhängig. Mona Lisa eilte in 13 Minuten durch kuhnMunkres.py, aber der Scarlet Chested Parakeet brauchte 16 Minuten.
Die Ergebnisse waren ähnlich wie bei zufälligen Swaps und Rotationen für den Sittich:
(kuhnMunkres.py links, zufällige Swaps rechts; Originalbild zum Vergleich )
Für das Mona Lisa-Bild, mit dem ich getestet habe, wurden die Ergebnisse jedoch merklich verbessert, und ihr klares "Lächeln" schien tatsächlich durch:
(kuhnMunkres.py links, zufällige Swaps rechts)