Tôi đã biên soạn một bức tranh khảm 2025 từ các avatar của người dùng Stack Overflow hàng đầu .
(Nhấp vào hình ảnh để xem kích thước đầy đủ.)
Nhiệm vụ của bạn là viết một thuật toán sẽ tạo ra một photomosaic chính xác của một hình ảnh khác bằng cách sử dụng các hình đại diện 48 × 48 pixel từ lưới 45 × 45 của chúng.
Hình ảnh thử nghiệm
Dưới đây là những hình ảnh thử nghiệm. Đầu tiên, tất nhiên, là một bóng đèn!
(Chúng không có kích thước đầy đủ ở đây. Nhấp vào hình ảnh để xem nó ở kích thước đầy đủ. Các phiên bản có kích thước bằng một nửa có sẵn cho The Kiss , Chiều chủ nhật ... , Steve Jobs và các quả cầu .)
Cảm ơn Wikipedia cho tất cả trừ những quả cầu raytraced.
Ở kích thước đầy đủ, tất cả các hình ảnh này đều có kích thước chia hết cho 48. Những hình lớn hơn phải là JPEG để chúng có thể được nén đủ để tải lên.
Chấm điểm
Đây là một cuộc thi phổ biến. Việc đệ trình với các bức tranh khảm mô tả chính xác nhất các hình ảnh gốc nên được bỏ phiếu. Tôi sẽ chấp nhận câu trả lời được bình chọn cao nhất trong một hoặc hai tuần.
Quy tắc
Photomosaics của bạn phải hoàn toàn bao gồm các hình đại diện 48 × 48 pixel không thay đổi được lấy từ khảm ở trên, được sắp xếp trong một lưới.
Bạn có thể sử dụng lại một hình đại diện trong một bức tranh khảm. (Thật vậy, đối với những hình ảnh thử nghiệm lớn hơn bạn sẽ phải.)
Hiển thị đầu ra của bạn, nhưng hãy nhớ rằng hình ảnh thử nghiệm rất lớn và StackExchange chỉ cho phép đăng hình ảnh lên tới 2MB . Vì vậy, nén hình ảnh của bạn hoặc lưu trữ chúng ở một nơi khác và đặt các phiên bản nhỏ hơn ở đây.
Để được xác nhận người chiến thắng, bạn phải cung cấp các phiên bản PNG của bóng đèn hoặc hình cầu khảm. Điều này là để tôi có thể xác nhận chúng (xem bên dưới) để đảm bảo bạn không thêm màu bổ sung vào hình đại diện để làm cho bức tranh ghép trông đẹp hơn.
Trình xác nhận
Tập lệnh Python này có thể được sử dụng để kiểm tra xem một khảm hoàn thành có thực sự sử dụng các avatar không thay đổi hay không. Chỉ cần đặt toValidate
và allTiles
. Nó không có khả năng hoạt động đối với JPEG hoặc các định dạng mất dữ liệu khác vì nó so sánh chính xác mọi thứ, 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))
Chúc mọi người may mắn! Tôi không thể chờ đợi để xem kết quả.
Lưu ý: Tôi biết các thuật toán photomosaic rất dễ tìm thấy trên mạng, nhưng chúng chưa có trên trang web này. Tôi thực sự hy vọng chúng ta sẽ thấy một cái gì đó thú vị hơn thuật toán "trung bình mỗi ô và mỗi không gian lưới và kết hợp chúng" .