Я грав із виготовленням мозаїк із зображеннями. Мій сценарій приймає велику кількість зображень, зменшує їх до розміру мініатюр, а потім використовує їх як плитки для наближення до цільового зображення.
Підхід насправді дуже приємний:
Я обчислюю середню квадратичну помилку для кожного великого пальця у кожному положенні плитки.
Спочатку я просто використовував жадібне розташування: кладіть великий палець з найменшою помилкою на плитку, яка найкраще підходить, а потім наступну тощо.
Проблема жадібної полягає в тому, що вона з часом дозволяє вам розміщувати найрізноманітніші великі пальці на найменш популярних плитках, незалежно від того, відповідають вони чи ні. Я показую приклади тут: http://williamedwardscoder.tumblr.com/post/84505278488/making-image-mosaics
Тоді я роблю випадкові заміни, поки скрипт не буде перерваний. Результати цілком в порядку.
Випадкова заміна двох плиток - це не завжди поліпшення, але іноді обертання трьох або більше плиток призводить до глобального поліпшення, тобто A <-> B
може не покращитися, але A -> B -> C -> A
1
може ..
З цієї причини, після вибору двох випадкових плиток і виявлення, що вони не покращуються, я підбираю купу плиток, щоб оцінити, чи можуть вони бути третьою плиткою в такому обертанні. Я не досліджую, чи можна вигідно обертати будь-який набір із чотирьох плиток тощо; це було б дуже дорого реально незабаром.
Але для цього потрібен час .. Багато часу!
Чи є кращий і швидший підхід?
Оновлення Bounty
Я перевірив різні реалізації та зв’язки угорського методу Python .
На сьогодні найшвидшим був чистий Python https://github.com/xtof-durr/makeSimple/blob/master/Munkres/kuhnMunkres.py
Моя думка полягає в тому, що це приблизно відповідає оптимальній відповіді; при запуску на тестовому зображенні всі інші бібліотеки погодилися на результат, але цей kuhnMunkres.py, хоч і набрав величини швидше, лише дуже-дуже наблизився до оцінки, про яку погодились інші реалізації.
Швидкість дуже залежить від даних; Мона Ліза промчала через kuhnMunkres.py за 13 хвилин, але Скарлет Честед Парашут зайняв 16 хвилин.
Результати були приблизно такі ж, як випадкові заміни та обертання для Parakeet:
(kuhnMunkres.py зліва, випадкові зміни в правій частині; оригінальне зображення для порівняння )
Однак, для тестування зображень Mona Lisa, які я тестував, результати помітно покращилися, і вона насправді мала яскраву усмішку:
(kuhnMunkres.py зліва, випадкові зміни в правій частині)