Я собрал мозаику из 2025 выстрелов в голову от аватаров лучших пользователей Stack Overflow .
(Нажмите на изображение, чтобы посмотреть его в полном размере.)
Ваша задача - написать алгоритм, который создаст точную фотомозаику другого изображения, используя аватары 48 × 48 пикселей из этой сетки 45 × 45.
Тестовые изображения
Вот тестовые изображения. Первая, конечно же, лампочка!
(Они не являются полноразмерными. Нажмите на изображение, чтобы просмотреть его в полном размере. Половинные версии доступны для Поцелуя , Воскресного полудня ... , Стива Джобса и сфер .)
Спасибо Википедии за все, кроме лучевых трасс.
В полноразмерном виде все эти изображения имеют размеры, кратные 48. Более крупные из них должны были быть в формате JPEG, чтобы они могли быть достаточно сжаты для загрузки.
счет
Это конкурс популярности. За представление с мозаиками, которые наиболее точно изображают исходные изображения, следует проголосовать. Я приму ответ с наибольшим количеством голосов через неделю или две.
правила
Ваша фотомозаика должна быть полностью составлена из неизмененных аватаров 48 × 48 пикселей, взятых из мозаики выше, расположенных в виде сетки.
Вы можете повторно использовать аватар в мозаике. (Действительно, для больших тестовых изображений вам придется.)
Покажите свой вывод, но имейте в виду, что тестовые изображения очень большие, и StackExchange позволяет публиковать изображения размером до 2 МБ . Поэтому сожмите свои изображения или разместите их где-нибудь еще и разместите меньшие версии здесь.
Для подтверждения победителя вы должны предоставить PNG-версии вашей лампочки или сферической мозаики. Поэтому я могу проверить их (см. Ниже), чтобы убедиться, что вы не добавляете дополнительные цвета в аватары, чтобы мозаика выглядела лучше.
Validator
Этот скрипт 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))
Удачи всем! Я не могу ждать, чтобы увидеть результаты.
Примечание: я знаю, что алгоритмы фотомозаики легко найти в Интернете, но их еще нет на этом сайте. Я действительно надеюсь, что мы увидим что-то более интересное, чем обычный алгоритм «усреднить каждую плитку и каждое пространство сетки и сопоставить их» .