Я склав мозаїку з 2025 головок з аватарів провідних користувачів Stack Overflow .
(Клацніть зображення, щоб переглянути його у повному розмірі.)
Ваше завдання - написати алгоритм, який створить точну фотомозаїку іншого зображення, використовуючи аватари 48 × 48 пікселів із цієї сітки 45 × 45.
Тестові зображення
Ось тестові зображення. Перший - це, звичайно, лампочка!
(Вони тут не в повному розмірі. Клацніть на зображення, щоб переглянути його у повному розмірі. Напіврозмірні версії доступні для The Kiss , A Sunday Afternight ... , Steve Jobs і сфер .)
Дякуємо Вікіпедії для всіх, окрім сфер, що променілися.
У повнорозмірному розмірі ці зображення мають розміри, що діляться на 48. Більші розміри повинні бути JPEG, щоб їх можна було достатньо стиснути для завантаження.
Оцінка балів
Це конкурс на популярність. Повідомлення з мозаїкою, які найточніше зображують оригінальні зображення, слід проголосувати. Я прийму найвищу відповідь за тиждень-два.
Правила
Ваша фотомозаїка повинна повністю складатися з незмінних аватарів 48 × 48 пікселів, знятих з мозаїки вгорі, розташованих у сітці.
Ви можете повторно використовувати аватар у мозаїці. (Дійсно, для великих тестових зображень вам доведеться.)
Покажіть свій вихід, але майте на увазі, що тестові зображення дуже великі, а StackExchange дозволяє розміщувати зображення лише до 2 Мб . Тому стискайте свої зображення або розміщуйте їх де-небудь ще та розміщуйте тут менші версії.
Щоб підтвердити переможця, ви повинні надати PNG версії мозаїки лампочки чи сфери. Це так, що я можу їх перевірити (див. Нижче), щоб переконатися, що ви не додаєте зайвих кольорів аватарам, щоб мозаїки виглядали краще.
Валідатор
Цей сценарій Python може бути використаний для перевірки, чи справді виконана мозаїка використовує незмінені аватари. Просто встановіть toValidate
і allTiles
. Це навряд чи буде працювати для JPEG або інших форматів з втратою, оскільки він порівнює речі точно, піксель за пікселем.
from PIL import Image, ImageChops
toValidate = 'test.png' #test.png is the mosaic to validate
allTiles = 'avatars.png' #avatars.png is the grid of 2025 48x48 avatars
def equal(img1, img2):
return ImageChops.difference(img1, img2).getbbox() is None
def getTiles(mosaic, (w, h)):
tiles = {}
for i in range(mosaic.size[0] / w):
for j in range(mosaic.size[1] / h):
x, y = i * w, j * h
tiles[(i, j)] = mosaic.crop((x, y, x + w, y + h))
return tiles
def validateMosaic(mosaic, allTiles, tileSize):
w, h = tileSize
if mosaic.size[0] % w != 0 or mosaic.size[1] % h != 0:
print 'Tiles do not fit mosaic.'
elif allTiles.size[0] % w != 0 or allTiles.size[1] % h != 0:
print 'Tiles do not fit allTiles.'
else:
pool = getTiles(allTiles, tileSize)
tiles = getTiles(mosaic, tileSize)
matches = lambda tile: equal(tiles[pos], tile)
success = True
for pos in tiles:
if not any(map(matches, pool.values())):
print 'Tile in row %s, column %s was not found in allTiles.' % (pos[1] + 1, pos[0] + 1)
success = False
if success:
print 'Mosaic is valid.'
return
print 'MOSAIC IS INVALID!'
validateMosaic(Image.open(toValidate).convert('RGB'), Image.open(allTiles).convert('RGB'), (48, 48))
Успіхів усім! Я не можу чекати, щоб побачити результати.
Примітка. Я знаю, що алгоритми фотомозаїки легко знайти в Інтернеті, але їх ще немає на цьому сайті. Я дуже сподіваюся, що ми побачимо щось цікавіше, ніж звичайний алгоритм "середня кожна плитка та кожен простір сітки та їх відповідність" .