Створюємо мозаїку з випадкових зображень


Дізнайтесь більше про нові кар'єрні можливості в EchoUA. Цікаві проекти, ринкова оплата, гарний колектив. Надсилайте резюме та приєднуйтеся до нас.

Розповідає Чарльз Ньюи, автор блогу blog.assemblyco.de


Якщо ви стежили за новинками сучасного мистецтва, ви напевно бачили щось, схоже на це:

Чи це:

Так, це дійсно обличчя Барака Обами, викладене мозаїкою з тостів різного прожарення.

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

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

Крок 1: пошук і обробка зображень

Я не знав, звідки можна було б узяти картинки – може, з Wikipedia Commons або Flickr? Може, взагалі з яких-небудь публічних джерел? У результаті було вирішено використати Flickr. Я написав простенький скрипт на Python, який шукає на Flickr зображення, використовуючи певний набір тегів (і фільтруючи їх по наявності ліцензії Creative Commons, зрозуміло), і викачує їх. Інший скрипт обрізує картинки до клітин розміру 32х32. Тепер, коли усі наші картинки одного розміру, їх можна використати в мозаїці.

У результаті я викачав і обробив близько 500 зображень з Flickr. Це дуже невеликий набір, тому я не розраховував, що результат буде дуже хорошим – але у результаті я був приємно здивований.

Крок 2: складання мозаїки

Цей етап абсолютно прямолінійний. Ось простий алгоритм для розставляння зображень :

  1. Рахувати цільове зображення (те, з якого ми хочемо зробити мозаїку).
  2. Рахувати увесь набір картинок.
  3. Для кожної картинки:
    • вичислити середній колір картинки;
    • зберегти це значення в структуру даних (для подальшого використання).
  4. Створити порожнє зображення потрібного розміру для розміщення картинок.
  5. Для кожного пікселя цільового зображення :
    • отримати його колір в RGB;
    • знайти картинку найбільш відповідного середнього кольору;
    • вставити відповідну картинку в порожнє зображення, створене раніше.
  6. Зберегти отримане зображення.

Визначення найбільш відповідної картинки

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

Підбір кращої картинки з набору робиться в лоб – досить будь-яким способом вичислити відстань між кожним каналом кольору між пікселем і середнім кольором картинки і відсортувати картинки по відстані. Перша буде кращим варіантом. Елементарно.

Результат

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

От як виглядає початкове зображення:

Перша спроба була успішною – ось що вийшло:

Ура, все працює!. але численні повтори однакових картинок ріжуть око. А що, якщо вибирати не найбільш відповідну картинку, а одну з п’яти найбільш відповідних?

Набагато краще! Так точно цікавіше. Для закріплення спробуємо ще одно особу – як щодо Мишель Обами?

Відмінно. Як щодо (біс, Обами закінчилися). ммм. як щодо мого обличчя?

От як я виглядаю:

А ось мозаїка, що вийшла :

Успіх! Непогано для пари днів роботи. Якщо це вас зацікавило, початковий код можна знайти на моєму GitHub.

Джерело: блог Assemblyco

Київ, Харків, Одеса, Дніпро, Запоріжжя, Кривий Ріг, Вінниця, Херсон, Черкаси, Житомир, Хмельницький, Чернівці, Рівне, Івано-Франківськ, Кременчук, Тернопіль, Луцьк, Ужгород, Кам'янець-Подільський, Стрий - за статистикою саме з цих міст програмісти найбільше переїжджають працювати до Львова. А Ви розглядаєте relocate?


Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *