Ich habe ein Mosaik von 2025 Headshots aus den Avataren der Top-Stack Overflow-Benutzer zusammengestellt .
(Klicken Sie auf das Bild, um es in voller Größe anzuzeigen.)
Ihre Aufgabe ist es, einen Algorithmus zu schreiben, der aus den 48 × 48 Pixel-Avataren dieses 45 × 45-Rasters ein genaues Fotomosaik eines anderen Bildes erstellt.
Bilder testen
Hier sind die Testbilder. Das erste ist natürlich eine Glühbirne!
(Sie sind hier nicht in voller Größe. Klicken Sie auf ein Bild, um es in voller Größe anzuzeigen. Für The Kiss , A Sunday Afternoon ... , Steve Jobs und die Sphären sind Versionen in halber Größe verfügbar .)
Vielen Dank an Wikipedia für alle außer den Raytracing-Sphären.
In voller Größe haben diese Bilder alle Abmessungen, die durch 48 teilbar sind. Die größeren Bilder mussten JPEGs sein, damit sie zum Hochladen komprimiert werden konnten.
Wertung
Dies ist ein Beliebtheitswettbewerb. Die Einreichung mit Mosaiken, die die Originalbilder am genauesten wiedergeben, sollte positiv bewertet werden. Ich werde die Antwort mit den meisten Stimmen in ein oder zwei Wochen annehmen.
Regeln
Ihre Fotomosaiken müssen vollständig aus unveränderten 48 × 48-Pixel-Avataren bestehen, die aus dem obigen Mosaik stammen und in einem Raster angeordnet sind.
Sie können einen Avatar in einem Mosaik wiederverwenden. (In der Tat müssen Sie für die größeren Testbilder.)
Zeigen Sie Ihre Ausgabe, aber denken Sie daran, dass die Testbilder sehr groß sind und StackExchange nur das Posten von Bildern mit bis zu 2 MB zulässt . Komprimieren Sie also Ihre Bilder oder hosten Sie sie woanders und fügen Sie hier kleinere Versionen ein.
Um als Gewinner bestätigt zu werden, müssen Sie PNG-Versionen Ihrer Glühbirnen- oder Kugelmosaike bereitstellen. Auf diese Weise kann ich sie überprüfen (siehe unten), um sicherzustellen, dass Sie den Avataren keine zusätzlichen Farben hinzufügen, damit die Mosaike besser aussehen.
Validator
Mit diesem Python-Skript können Sie überprüfen, ob ein fertiges Mosaik wirklich unveränderte Avatare verwendet. Einfach einstellen toValidate
und allTiles
. Es ist unwahrscheinlich, dass es für JPEGs oder andere verlustbehaftete Formate funktioniert, da es die Dinge Pixel für Pixel genau vergleicht.
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))
Viel Glück euch allen! Ich kann es kaum erwarten, die Ergebnisse zu sehen.
Hinweis: Ich weiß, dass Fotomosaik-Algorithmen online leicht zu finden sind, aber noch nicht auf dieser Website. Ich hoffe wirklich, dass wir etwas interessanteres sehen als den üblichen Algorithmus "Durchschnitt für jede Kachel und jeden Rasterplatz und Abgleich" .