Compilei um mosaico de 2025 fotos na cabeça dos avatares dos principais usuários do Stack Overflow .
(Clique na imagem para vê-la em tamanho real.)
Sua tarefa é escrever um algoritmo que crie um fotomosaico preciso de outra imagem usando os avatares de 48 × 48 pixels dessa grade de 45 × 45 deles.
Imagens de teste
Aqui estão as imagens de teste. O primeiro é, obviamente, uma lâmpada!
(Eles não são em tamanho normal aqui. Clique em uma imagem para vê-la em tamanho normal. As versões em tamanho real estão disponíveis para The Kiss , A Sunday Afternoon ... , Steve Jobs e as esferas .)
Obrigado à Wikipedia por todas, exceto as esferas traçadas por raios.
Em tamanho real, essas imagens têm todas as dimensões divisíveis por 48. As maiores tinham que ser JPEGs para que pudessem ser compactadas o suficiente para serem carregadas.
Pontuação
Este é um concurso de popularidade. A submissão com mosaicos que descrevam com mais precisão as imagens originais deve ser votada. Aceitarei a resposta mais votada em uma semana ou duas.
Regras
Seu fotomosaico deve ser inteiramente composto por avatares inalterados de 48 × 48 pixels, retirados do mosaico acima, dispostos em uma grade.
Você pode reutilizar um avatar em um mosaico. (Na verdade, para as imagens de teste maiores, você precisará.)
Mostre sua saída, mas lembre-se de que as imagens de teste são muito grandes e o StackExchange permite apenas a publicação de imagens de até 2 MB . Comprima suas imagens ou hospede-as em outro lugar e coloque versões menores aqui.
Para ser confirmado o vencedor, você deve fornecer versões PNG dos mosaicos de lâmpadas ou esferas. Isso é para que eu possa validá-los (veja abaixo) para garantir que você não esteja adicionando cores extras aos avatares para melhorar a aparência dos mosaicos.
Validador
Esse script Python pode ser usado para verificar se um mosaico completo realmente usa avatares inalterados. Basta definir toValidate
e allTiles
. É improvável que funcione para JPEGs ou outros formatos com perdas, pois compara as coisas exatamente, pixel por pixel.
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))
Boa sorte a todos! Mal posso esperar para ver os resultados.
Nota: Eu sei que é fácil encontrar algoritmos fotomosaicos on-line, mas ainda não estão neste site. Eu realmente espero que vejamos algo mais interessante do que o algoritmo usual "média de cada bloco e cada espaço da grade e combiná-los" .