Я играл с созданием мозаики изображений. Мой сценарий берет большое количество изображений, масштабирует их до размера миниатюры, а затем использует их в качестве плиток для аппроксимации целевого изображения.
Подход на самом деле довольно приятен:
Я вычисляю среднеквадратичную ошибку для каждого большого пальца в каждой позиции тайла.
Сначала я просто использовал жадное размещение: поместите большой палец с наименьшей ошибкой на плитку, которая лучше всего подходит, а затем следующую и так далее.
Проблема с жадностью заключается в том, что в конечном итоге вы кладете самые разные большие пальцы на наименее популярные плитки, независимо от того, совпадают они или нет. Я показываю примеры здесь: http://williamedwardscoder.tumblr.com/post/84505278488/making-image-mosaics
Поэтому я делаю случайные перестановки, пока скрипт не будет прерван. Результаты вполне нормальные.
Случайный обмен двух плиток не всегда является улучшением, но иногда чередование трех или более плиток приводит к глобальному улучшению, то есть A <-> B
не может улучшиться, но A -> B -> C -> A
1
может ...
По этой причине, после выбора двух случайных плиток и обнаружения их улучшения, я выбираю кучу плиток, чтобы оценить, могут ли они быть третьей плиткой в таком повороте. Я не исследую, можно ли с пользой вращать любой набор из четырех плиток и т. Д .; это было бы очень дорого очень скоро.
Но это требует времени .. Много времени!
Есть ли лучший и быстрый подход?
Обновление Баунти
Я протестировал различные реализации Python и привязки венгерского метода .
Безусловно, самым быстрым был чистый Python https://github.com/xtof-durr/makeSimple/blob/master/Munkres/kuhnMunkres.py
Я догадываюсь, что это приближает к оптимальному ответу; при запуске на тестовом образе все другие библиотеки согласились с результатом, но этот файл kuhnMunkres.py, будучи на несколько порядков быстрее, только очень и очень близко приблизился к баллу, согласованному другими реализациями.
Скорость очень зависит от данных; Мона Лиза помчалась через kuhnMunkres.py через 13 минут, но Scarlet Chested Parakeet заняла 16 минут.
Результаты были почти такими же, как случайные свопы и ротации для попугая:
(kuhnMunkres.py слева, случайные перестановки справа; исходное изображение для сравнения )
Однако, для изображения Моны Лизы, с которым я тестировал, результаты были заметно улучшены, и у нее фактически была ее определенная улыбка:
(kuhnMunkres.py слева, случайные перестановки справа)