J'ai compilé une mosaïque de 2025 tirs à la tête à partir des avatars des principaux utilisateurs de Stack Overflow .
(Cliquez sur l'image pour la voir en taille réelle.)
Votre tâche consiste à écrire un algorithme permettant de créer une photomosaïque précise d'une autre image à l'aide des avatars de 48 × 48 pixels de cette grille de 45 × 45.
Images d'essai
Voici les images de test. Le premier est, bien sûr, une ampoule!
(Ils ne sont pas en taille réelle ici. Cliquez sur une image pour la voir en taille réelle. Des versions en taille réduite sont disponibles pour The Kiss , Un dimanche après-midi ... , Steve Jobs et les sphères .)
Merci à Wikipedia pour toutes les sphères sauf les rayons.
A leur taille maximale, ces images ont toutes des dimensions divisibles par 48. Les plus grandes doivent être des images JPEG pour pouvoir être suffisamment comprimées pour être téléchargées.
Notation
C'est un concours de popularité. La soumission avec des mosaïques qui représentent le plus fidèlement les images originales doit être votée. J'accepterai la réponse la plus votée dans une semaine ou deux.
Règles
Vos mosaïques photographiques doivent être entièrement composées d' avatars inaltérés de 48 × 48 pixels extraits de la mosaïque ci-dessus, disposés en grille.
Vous pouvez réutiliser un avatar dans une mosaïque. (En effet, pour les images de test plus grandes, vous devrez le faire.)
Montrez votre sortie, mais gardez à l' esprit que les images de test sont très grandes, et StackExchange permet uniquement l' affichage d'images à 2MB . Alors, compressez vos images ou hébergez-les ailleurs et mettez des versions plus petites ici.
Pour être confirmé gagnant, vous devez fournir les versions PNG de votre mosaïque à ampoule ou sphères. C’est pour que je puisse les valider (voir ci-dessous) afin de vous assurer que vous n’ajoutez pas de couleurs supplémentaires aux avatars pour améliorer l’apparence des mosaïques.
Validateur
Ce script Python peut être utilisé pour vérifier si une mosaïque terminée utilise réellement des avatars non modifiés. Il suffit de mettre toValidate
et allTiles
. Il est peu probable que cela fonctionne avec les formats JPEG ou autres formats avec pertes, car il compare exactement les choses, pixel par 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))
Bonne chance à tous! J'ai hâte de voir les résultats.
Note: Je sais que les algorithmes de photomosaïque sont faciles à trouver en ligne, mais ils ne sont pas encore sur ce site. J'espère vraiment que nous verrons quelque chose de plus intéressant que l' algorithme habituel "moyenne de chaque tuile et de chaque espace de grille et les faire correspondre" .