He compilado un mosaico de 2025 disparos a la cabeza de los avatares de los principales usuarios de Stack Overflow .
(Haga clic en la imagen para verla en tamaño completo).
Su tarea es escribir un algoritmo que cree un fotomosaico preciso de otra imagen utilizando los avatares de 48 × 48 píxeles de esta cuadrícula de 45 × 45 de ellos.
Imágenes de prueba
Aquí están las imágenes de prueba. ¡El primero es, por supuesto, una bombilla!
(No son de tamaño completo aquí. Haga clic en una imagen para verla en tamaño completo. Hay versiones de tamaño medio disponibles para The Kiss , A Sunday Afternoon ... , Steve Jobs y las esferas ).
Gracias a Wikipedia por todas menos las esferas de trazado de rayos.
A tamaño completo, todas estas imágenes tienen dimensiones divisibles por 48. Las más grandes tenían que ser JPEG para que pudieran comprimirse lo suficiente como para cargarlas.
Tanteo
Este es un concurso de popularidad. La presentación con mosaicos que representan con mayor precisión las imágenes originales debe ser votada. Aceptaré la respuesta más votada en una o dos semanas.
Reglas
Sus fotomosaicos deben estar completamente compuestos por avatares inalterados de 48 × 48 píxeles tomados del mosaico de arriba, dispuestos en una cuadrícula.
Puedes reutilizar un avatar en un mosaico. (De hecho, para las imágenes de prueba más grandes tendrá que hacerlo).
Muestre su salida, pero tenga en cuenta que las imágenes de prueba son muy grandes y que StackExchange solo permite publicar imágenes de hasta 2 MB . Así que comprima sus imágenes o guárdelas en otro lugar y ponga versiones más pequeñas aquí.
Para ser confirmado el ganador, debe proporcionar versiones PNG de su bombilla o mosaicos de esferas. Esto es para que pueda validarlos (ver más abajo) para asegurarme de que no agregue colores adicionales a los avatares para que los mosaicos se vean mejor.
Validador
Este script de Python se puede usar para verificar si un mosaico completo realmente usa avatares inalterados. Solo establece toValidate
y allTiles
. Es poco probable que funcione para JPEG u otros formatos con pérdida, ya que compara las cosas exactamente, píxel por píxel.
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))
¡Buena suerte a todos! No puedo esperar para ver los resultados.
Nota: Sé que los algoritmos fotomosaicos son fáciles de encontrar en línea, pero aún no están en este sitio. Realmente espero que veamos algo más interesante que el algoritmo habitual "promedio de cada mosaico y cada espacio de cuadrícula y unirlos" .