Ho compilato un mosaico di 2025 colpi alla testa dagli avatar degli utenti principali di Stack Overflow .
(Fare clic sull'immagine per visualizzarla a grandezza naturale.)
Il tuo compito è quello di scrivere un algoritmo che creerà un fotomosaico accurato di un'altra immagine usando gli avatar 48 × 48 pixel da questa griglia 45 × 45.
Immagini di prova
Ecco le immagini di prova. La prima è, ovviamente, una lampadina!
(Non sono a grandezza naturale qui. Fai clic su un'immagine per visualizzarla a grandezza naturale. Sono disponibili versioni a mezza grandezza per The Kiss , A Sunday Afternoon ... , Steve Jobs e le sfere .)
Grazie a Wikipedia per tutti tranne le sfere raytracing.
A grandezza naturale, tutte queste immagini hanno dimensioni divisibili per 48. Le più grandi dovevano essere JPEG per poter essere sufficientemente compresse da caricare.
punteggio
Questo è un concorso di popolarità. La votazione con i mosaici che descrivono più accuratamente le immagini originali dovrebbe essere votata. Accetterò la risposta più votata tra una settimana o due.
Regole
La tua fotomosaica deve essere interamente composta da avatar inalterati di 48 × 48 pixel presi dal mosaico sopra, disposti in una griglia.
Puoi riutilizzare un avatar in un mosaico. (In effetti per le immagini di prova più grandi dovrete.)
Mostra il tuo output, ma tieni presente che le immagini di prova sono molto grandi e StackExchange consente solo la pubblicazione di immagini fino a 2 MB . Quindi comprimere le immagini o ospitarle altrove e inserire qui versioni più piccole.
Per essere confermato il vincitore devi fornire le versioni PNG della tua lampadina o dei mosaici a sfere. Questo è così che posso convalidarli (vedi sotto) per assicurarmi di non aggiungere colori extra agli avatar per rendere i mosaici migliori.
Validator
Questo script Python può essere utilizzato per verificare se un mosaico completato utilizza davvero avatar inalterati. Basta impostare toValidate
e allTiles
. È improbabile che funzioni per JPEG o altri formati con perdita di dati poiché confronta esattamente le cose, pixel per 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))
Buona fortuna a tutti! Non vedo l'ora di vedere i risultati.
Nota: so che gli algoritmi fotomosaici sono facili da trovare online, ma non sono ancora su questo sito. Spero davvero che vedremo qualcosa di più interessante del solito algoritmo "media ogni riquadro e ogni spazio della griglia e abbinarli" .