Ho giocato con la creazione di mosaici di immagini. La mia sceneggiatura prende un gran numero di immagini, le ridimensiona in base alle dimensioni dell'anteprima e quindi le utilizza come riquadri per approssimare un'immagine di destinazione.
L'approccio è in realtà abbastanza piacevole:
Calcolo l'errore quadratico medio per ogni pollice in ogni posizione della piastrella.
All'inizio ho appena usato un posizionamento avido: metti il pollice con il minimo errore sulla piastrella che meglio si adatta, e poi il successivo e così via.
Il problema con l'avido è che alla fine ti lascia posizionare i pollici più diversi sulle tessere meno popolari, indipendentemente dal fatto che corrispondano o meno. Mostro esempi qui: http://williamedwardscoder.tumblr.com/post/84505278488/making-image-mosaics
Quindi eseguo scambi casuali fino a quando lo script non viene interrotto. I risultati sono abbastanza soddisfacenti.
Uno scambio casuale di due tessere non è sempre un miglioramento, ma a volte una rotazione di tre o più tessere si traduce in un miglioramento globale, cioè A <-> B
potrebbe non migliorare, ma A -> B -> C -> A
1
potrebbe ..
Per questo motivo, dopo aver scelto due tessere casuali e aver scoperto che non migliorano, scelgo un gruppo di tessere per valutare se possono essere la terza tessera in tale rotazione. Non esploro se una serie di quattro tessere può essere ruotata proficuamente, e così via; sarebbe molto costoso molto presto.
Ma questo richiede tempo .. Un sacco di tempo!
Esiste un approccio migliore e più veloce?
Aggiornamento di Bounty
Ho testato varie implementazioni e collegamenti Python del metodo ungherese .
Di gran lunga il più veloce è stato il puro Python https://github.com/xtof-durr/makeSimple/blob/master/Munkres/kuhnMunkres.py
La mia impressione è che ciò approssima la risposta ottimale; quando eseguito su un'immagine di prova, tutte le altre biblioteche concordavano sul risultato ma questo kuhnMunkres.py, pur essendo ordini di grandezza più veloci, si avvicinava molto molto al punteggio ottenuto dalle altre implementazioni concordate.
La velocità dipende molto dai dati; Mona Lisa si è precipitata attraverso kuhnMunkres.py in 13 minuti, ma il Parrocchetto di Petto Scarlatto ha impiegato 16 minuti.
I risultati erano quasi gli stessi degli scambi e delle rotazioni casuali per il Parakeet:
(kuhnMunkres.py a sinistra, scambi casuali a destra; immagine originale per il confronto )
Tuttavia, per l'immagine di Mona Lisa con cui ho provato, i risultati sono stati notevolmente migliorati e in realtà ha fatto brillare il suo "sorriso" definito:
(kuhnMunkres.py a sinistra, scambi casuali a destra)