Eu tenho brincado fazendo mosaicos de imagens. Meu script captura um grande número de imagens, reduz ao tamanho das miniaturas e as usa como blocos para aproximar uma imagem de destino.
A abordagem é realmente bastante agradável:
Calculo o erro quadrático médio para cada polegar em cada posição do bloco.
No começo, acabei de usar um posicionamento ganancioso: coloque o polegar com o menor erro no ladrilho que melhor se encaixa e depois no próximo e assim por diante.
O problema com o ganancioso é que, eventualmente, você coloca os polegares mais diferentes nos ladrilhos menos populares, combinando-os de perto ou não. Eu mostro exemplos aqui: http://williamedwardscoder.tumblr.com/post/84505278488/making-image-mosaics
Então, faço trocas aleatórias até que o script seja interrompido. Os resultados são bastante bons.
Uma troca aleatória de dois blocos nem sempre é uma melhoria, mas às vezes uma rotação de três ou mais blocos resulta em uma melhoria global, ou seja, A <-> B
pode não melhorar, mas A -> B -> C -> A
1
pode ..
Por esse motivo, depois de escolher duas peças aleatórias e descobrir que elas não melhoram, eu escolho várias peças para avaliar se elas podem ser a terceira peça dessa rotação. Não exploro se qualquer conjunto de quatro peças pode ser rotacionado com lucro, e assim por diante; isso seria super caro em breve.
Mas isso leva tempo .. Muito tempo!
Existe uma abordagem melhor e mais rápida?
Atualização de recompensa
Testei várias implementações e ligações do Python do método húngaro .
De longe o mais rápido foi o https://github.com/xtof-durr/makeSimple/blob/master/Munkres/kuhnMunkres.py
Meu palpite é que isso se aproxima da resposta ideal; quando executadas em uma imagem de teste, todas as outras bibliotecas concordaram com o resultado, mas esse kuhnMunkres.py, apesar de ter ordens de magnitude mais rápidas, ficou muito, muito, muito próximo da pontuação que as outras implementações concordaram.
A velocidade depende muito dos dados; Mona Lisa correu pelo kuhnMunkres.py em 13 minutos, mas o Periquito-de-peito-escarlate levou 16 minutos.
Os resultados foram os mesmos que os swaps e rotações aleatórias para o periquito:
(kuhnMunkres.py à esquerda, trocas aleatórias à direita; imagem original para comparação )
No entanto, para a imagem da Mona Lisa com a qual eu testei, os resultados foram visivelmente aprimorados e ela realmente teve seu 'sorriso' definido brilhando:
(kuhnMunkres.py à esquerda, trocas aleatórias à direita)