Saya telah menyusun mosaik 2025 headshots dari avatar pengguna Stack Overflow teratas .
(Klik gambar untuk melihatnya dalam ukuran penuh.)
Tugas Anda adalah menulis algoritma yang akan membuat fotomosaic akurat dari gambar lain menggunakan avatar 48 × 48 piksel dari kisi 45x45 ini.
Gambar Uji
Inilah gambar-gambar uji. Yang pertama, tentu saja, bola lampu!
(Mereka tidak berukuran penuh di sini. Klik gambar untuk melihatnya dalam ukuran penuh. Versi setengah ukuran tersedia untuk The Kiss , A Sunday Afternoon ... , Steve Jobs , dan the spheres .)
Terima kasih untuk Wikipedia untuk semua kecuali bidang raytraced.
Pada ukuran penuh gambar-gambar ini semua memiliki dimensi yang dapat dibagi oleh 48. Yang lebih besar harus JPEG sehingga mereka dapat dikompresi cukup untuk diunggah.
Mencetak gol
Ini adalah kontes popularitas. Kiriman dengan mosaik yang paling akurat menggambarkan gambar asli harus dipilih. Saya akan menerima jawaban dengan suara tertinggi dalam satu atau dua minggu.
Aturan
Fotomosis Anda harus seluruhnya terdiri dari avatar 48 × 48 piksel yang tidak diubah yang diambil dari mosaik di atas, disusun dalam kisi-kisi.
Anda dapat menggunakan kembali avatar di mosaik. (Memang untuk gambar uji yang lebih besar Anda harus melakukannya.)
Tunjukkan hasil Anda, tetapi perlu diingat bahwa gambar uji sangat besar, dan StackExchange hanya memungkinkan pengiriman gambar hingga 2MB . Jadi kompres gambar Anda atau tempatkan mereka di tempat lain dan letakkan versi yang lebih kecil di sini.
Untuk dikonfirmasi pemenang, Anda harus memberikan versi bola lampu atau mosaik bola PNG. Ini agar saya dapat memvalidasi mereka (lihat di bawah) untuk memastikan Anda tidak menambahkan warna ekstra ke avatar untuk membuat mosaik terlihat lebih baik.
Validator
Skrip Python ini dapat digunakan untuk memeriksa apakah mosaik yang lengkap benar-benar menggunakan avatar yang tidak diubah. Cukup atur toValidate
dan allTiles
. Ini tidak mungkin bekerja untuk JPEG atau format lossy lainnya karena ia membandingkan hal-hal dengan tepat, pixel-for-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))
Semoga beruntung semuanya! Saya tidak sabar untuk melihat hasilnya.
Catatan: Saya tahu algoritma photomosaic mudah ditemukan secara online, tetapi belum ada di situs ini. Saya benar-benar berharap kita melihat sesuatu yang lebih menarik daripada algoritma "rata-rata setiap ubin dan setiap ruang kotak dan mencocokkannya" .