En iyi Stack Overflow kullanıcılarının avatarlarından 2025 kafa resmi mozaiği hazırladım .
(Resmin tamamını görmek için resme tıklayın.)
Göreviniz, bu 45 × 45 ızgarasındaki 48 × 48 piksel avatarları kullanarak başka bir görüntünün doğru bir fotomosaikini oluşturacak bir algoritma yazmaktır.
Test görüntüleri
İşte test görüntüleri. İlki, elbette bir ampul!
(Burada tam boyutlu değiller. Tam boyutta görmek için resim üzerine tıklayın. The Kiss , Pazar Öğleden Sonra ... , Steve Jobs ve küreler için yarım boyutlu sürümleri mevcuttur .)
Raytraced küreler dışındaki herkes için Wikipedia'ya teşekkürler.
Tam boyutta bu resimlerin tümü 48 ile bölünebilir boyutlara sahiptir. Daha büyük olanların JPEG olması gerekiyordu, böylece yüklenebilecek kadar sıkıştırılmışlardı.
puanlama
Bu bir popülerlik yarışması. Orijinal görüntüleri en doğru şekilde gösteren mozaiklerle yapılan sunum oylanmalıdır. Bir veya iki hafta içinde en yüksek oyu alan cevabı kabul edeceğim.
kurallar
Fotomosaikleriniz tamamen bir ızgarada düzenlenmiş, yukarıdaki mozaikten alınmış , değiştirilmemiş 48 × 48 piksel avatarlardan oluşmalıdır .
Bir avatarı bir mozaikte yeniden kullanabilirsiniz. (Gerçekten de, yapmanız gereken daha büyük test görüntüleri için.)
Çıktınızı gösterin, ancak test resimlerinin çok büyük olduğunu ve StackExchange'in yalnızca 2 MB'a kadar görüntülerin gönderilmesine izin verdiğini unutmayın . Bu nedenle resimlerinizi sıkıştırın veya başka bir yerde barındırın ve daha küçük sürümleri buraya yerleştirin.
Kazanan onaylamak için, ampulünüzün veya küreler mozaiğinizin PNG versiyonlarını sağlamalısınız. Bu, mozaiklerin daha iyi görünmesini sağlamak için avatarlara fazladan renk eklemediğinizden emin olmak için bunları doğrulayabilirim (aşağıya bakınız).
Doğrulayıcı
Bu Python betiği, tamamlanmış bir mozaiğin gerçekten değiştirilmemiş avatarlar kullanıp kullanmadığını kontrol etmek için kullanılabilir. Sadece ayarlayın toValidate
ve allTiles
. Piksel için pikselleri tam olarak karşılaştırdığından, JPEG'ler veya diğer kayıp biçimler için çalışmak pek mümkün değildir.
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))
Herkese iyi şanslar! Sonuçları görmek için sabırsızlanıyorum.
Not: Fotomosaik algoritmaların çevrimiçi olarak kolayca bulunabileceğini biliyorum, ancak henüz bu sitede değiller. Gerçekten "her bir karoyu ve her ızgara alanını ortala ve eşleştir" algoritmasından daha ilginç bir şey görmeyi umuyorum .