เราได้รวบรวมกระเบื้องโมเสคของ 2025 headshots จากอวตารของผู้ใช้กองมากเกินด้านบน
(คลิกที่ภาพเพื่อดูขนาดเต็ม)
งานของคุณคือการเขียนอัลกอริทึมที่จะสร้าง photomosaic ที่ถูกต้องของรูปภาพอื่นโดยใช้อวตาร 48 × 48 พิกเซลจากกริด 45 × 45 ตัวนี้
ทดสอบภาพ
นี่คือภาพทดสอบ แรกคือแน่นอนหลอดไฟ!
(ภาพเหล่านี้ไม่เต็มขนาดคลิกที่ภาพเพื่อดูขนาดเต็มมีเวอร์ชั่นครึ่งขนาดให้บริการสำหรับThe Kiss , A Sunday Af บ่าย ... , Steve Jobs , และspheres )
ขอบคุณ Wikipedia สำหรับทุกคนยกเว้นทรงกลม raytraced
ในขนาดเต็มภาพเหล่านี้จะมีขนาดที่หารด้วย 48 ภาพที่มีขนาดใหญ่กว่าต้องเป็น JPEG ดังนั้นจึงสามารถบีบอัดได้เพียงพอที่จะอัปโหลด
เกณฑ์การให้คะแนน
นี่คือการประกวดความนิยม การส่งภาพโมเสกที่แสดงภาพต้นฉบับได้อย่างแม่นยำที่สุดควรได้รับการโหวต ฉันจะยอมรับคำตอบที่โหวตสูงสุดในหนึ่งหรือสองสัปดาห์
กฎระเบียบ
photomosaics ของคุณจะต้องประกอบด้วยอวตาร 48 × 48 พิกเซลที่ไม่เปลี่ยนแปลงทั้งหมดจากภาพโมเสคด้านบนซึ่งจัดเรียงเป็นตาราง
คุณสามารถใช้ Avatar ในโมเสกได้ (แน่นอนว่าสำหรับภาพทดสอบขนาดใหญ่ที่คุณต้องทำ)
แสดงผลลัพธ์ของคุณ แต่โปรดจำไว้ว่าภาพทดสอบมีขนาดใหญ่มากและStackExchange อนุญาตให้โพสต์ภาพได้สูงสุด 2MBเท่านั้น ดังนั้นบีบอัดรูปภาพของคุณหรือโฮสต์ไว้ที่อื่นแล้ววางรุ่นเล็กลงที่นี่
เพื่อให้ได้รับการยืนยันผู้ชนะคุณจะต้องระบุหลอดไฟ PNG หรือลูกกลมของคุณ นี่คือดังนั้นฉันสามารถตรวจสอบพวกเขา (ดูด้านล่าง) เพื่อให้แน่ใจว่าคุณไม่ได้เพิ่มสีพิเศษให้กับรูปประจำตัวเพื่อทำให้กระเบื้องโมเสคดูดีขึ้น
ตรวจสอบ
สามารถใช้สคริปต์ Python นี้เพื่อตรวจสอบว่า mosaic ที่เสร็จสมบูรณ์ใช้รูปประจำตัวที่ไม่เปลี่ยนแปลงหรือไม่ เพียงแค่ตั้งค่าtoValidate
และallTiles
และมันไม่น่าจะทำงานกับ JPEG หรือรูปแบบที่สูญเสียอื่น ๆ เพราะมันเปรียบเทียบสิ่งต่าง ๆ อย่างแน่นอนพิกเซลต่อพิกเซล
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))
โชคดีนะทุกคน! ฉันไม่สามารถรอดูผลลัพธ์
หมายเหตุ:ฉันรู้ว่าอัลกอริทึม photomosaic นั้นหาได้ง่ายออนไลน์ แต่พวกเขายังไม่ได้อยู่ในไซต์นี้ ฉันหวังว่าเราจะเห็นสิ่งที่น่าสนใจกว่าอัลกอริทึม"เฉลี่ยแต่ละไทล์และแต่ละกริดและจับคู่กับอัลกอริทึม"