Алгоритми створення мозаїк зображень - чи існує швидший спосіб, ніж цей?


9

Я грав із виготовленням мозаїк із зображеннями. Мій сценарій приймає велику кількість зображень, зменшує їх до розміру мініатюр, а потім використовує їх як плитки для наближення до цільового зображення.

Підхід насправді дуже приємний:

Я обчислюю середню квадратичну помилку для кожного великого пальця у кожному положенні плитки.

Спочатку я просто використовував жадібне розташування: кладіть великий палець з найменшою помилкою на плитку, яка найкраще підходить, а потім наступну тощо.

Проблема жадібної полягає в тому, що вона з часом дозволяє вам розміщувати найрізноманітніші великі пальці на найменш популярних плитках, незалежно від того, відповідають вони чи ні. Я показую приклади тут: http://williamedwardscoder.tumblr.com/post/84505278488/making-image-mosaics

Тоді я роблю випадкові заміни, поки скрипт не буде перерваний. Результати цілком в порядку.

Випадкова заміна двох плиток - це не завжди поліпшення, але іноді обертання трьох або більше плиток призводить до глобального поліпшення, тобто A <-> Bможе не покращитися, але A -> B -> C -> A1може ..

З цієї причини, після вибору двох випадкових плиток і виявлення, що вони не покращуються, я підбираю купу плиток, щоб оцінити, чи можуть вони бути третьою плиткою в такому обертанні. Я не досліджую, чи можна вигідно обертати будь-який набір із чотирьох плиток тощо; це було б дуже дорого реально незабаром.

Але для цього потрібен час .. Багато часу!

Чи є кращий і швидший підхід?


Оновлення 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 зліва, випадкові зміни в правій частині)


1
Пов'язані ... іш. На трансформації неба Кодегольфа були подібні проблеми.

1
І ще один пов'язаний набір зображень - це allRGB, де кожне зображення (хоча це не дає вам занадто багато підказки, як це зробити ... просто, що є ще одна область, де ця проблема була вирішена).

1
Я зіткнувся з цією проблемою з виробником мозаїки досить багато років тому. Моя суть міркувань тоді і зараз полягає в тому, що проблема полягає не стільки в алгоритмі (частина MSE), скільки в обмеженому розмірі палітри вхідних зображень. Не маючи мільярду зображень для роботи, я підробив це, дозволивши повторно використовувати зображення через деякий час. Однак, якщо ви хочете дотримуватися свого підходу, можливо, буде добре зробити перший пропуск для "хороших" приладів, а потім ставитися до решти зображень як до випадкових (або випадкових результатів) - з обмеженим набором введення, який ви маєте лише так багато варіантів.
J Trana

@MichaelT дякую за це чудове посилання :) Особливо вражаючий кодовий гольф. Я вважаю, що найкращі рішення, що проголосували, використовують випадкові заміни (а не випадкові обертання) і, імовірно, працюють досить довго ...
Буде

1
Прийдіть до цього після того, як ви обрали відповідь та вручили суму винагороди. Іншим підходом було б трактувати це як проблему симуляційного відпалу . Ви можете використовувати SA як один з етапів вашого газопроводу.
andy256

Відповіді:


3

Так, є два кращих і швидших підходи.

  • Простіша проблема: для кожної плитки виберіть найкращий палець (з можливим дублюванням). Гаразд, це обман, але це може призвести лише до кращого зорового результату.
  • Ваша передача є алгоритмічно цікавішою і зводиться до "задачі лінійного призначення", припускаючи, що ви приймаєте MSE як витрати на відповідність, сума яких повинна бути мінімальною. Таку проблему можна вирішити за багаточлен, наприклад, за допомогою "Угорського методу"

Потім ви можете скорегувати свої витрати, замінивши MSE на більш візуально точну відстань, не змінюючи основний алгоритм.


Дякую! LAP та угорський метод були мені потрібними ведучими! Оновіть результати, про які йдеться.
Буде чи

3

Я впевнено впевнений, що це важка проблема. Щоб знайти «ідеальне» рішення, ви повинні спробувати всі можливості вичерпно, і це експоненційно.

Одним із підходів було б використати жадібну форму, а потім спробувати вдосконалити її. Це може бути, якщо взяти неправильно розміщене зображення (одне з останніх) і знайти інше місце для його розміщення, потім взяти це зображення і перемістити його тощо. Ви робите, коли у вас (а) не вистачає часу (б) придатність «досить хороша».

Якщо ви введете ймовірнісний елемент, це може спричинити модельований підхід відпалу або генетичний алгоритм. Можливо, все, чого ви намагаєтеся досягти, - це розподілити помилки рівномірно. Я підозрюю, що це наближається до того, що ви вже робите, тому відповідь така: за допомогою правильного алгоритму ви можете отримати кращий результат швидше, але немає чарівного ярлика до Nirvana.


Так, це схоже на те, що ти вже робиш. Сенс у тому, щоб забути магічну відповідь і продумати два алгоритми: спочатку заповніть, а потім оптимізуйте.

Заливка може бути: випадкова, найкраща, перша, найкраща, досить хороша, якась гаряча точка.

Оптимізація може бути випадковою, виправити найгірше або (як я запропонував) імітувати відпал або генетичний алгоритм.

Вам потрібен показник «доброти» та кількість часу, який ви готові витратити на це та просто експериментувати. Або знайти когось, хто насправді це зробив.


Ви точно описуєте підхід, описаний у питанні ...?
Буде

1

Якщо остання плитка - ваша проблема, вам слід спробувати якомога раніше поставити їх;)

Одним із підходів було б подивитися на плитку, яка знаходиться найдалі від верхнього х% її відповідностей (інтуїтивно я б хотів із 33%) та розмістити її в найкращому співпаданні. Це найкраща відповідність у будь-якому випадку.

Крім того, ви можете вибрати не використовувати найкращу відповідність для найгіршої плитки, але ту, де вона вводить найменшу помилку порівняно з найкращим матчем для цього слота, так що ви не повністю викинете свої кращі матчі заради " контроль за пошкодженнями ".

Інша річ, що потрібно мати на увазі, це те, що врешті ви створюєте зображення, яке обробляється оком. Тож те, що ви насправді хочете, - це використовувати деяке виявлення краю, щоб визначити, які позиції на вашому зображенні є найбільш важливими. Так само те, що відбувається на самій периферії зображення, має мало значення для якості ефекту. Накладіть ці дві ваги і включіть їх у свій розрахунок відстані. Таким чином, будь-яке тремтіння повинно тяжіти до кордону і від країв, тим самим заважаючи набагато менше.

Також із встановленням ребер, можливо, ви захочете розмістити перший y% жадібно (можливо, поки ви не опуститеся нижче певного порогу "в'язкість" у плитках ліворуч), щоб "гарячі точки" вирішувались дуже добре, а потім перейти до "контролю за пошкодженнями" для решти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.