Skompilowałem mozaikę 2025 strzałów w głowę z awatarów najlepszych użytkowników Stack Overflow .
(Kliknij obraz, aby wyświetlić go w pełnym rozmiarze).
Twoim zadaniem jest napisanie algorytmu, który utworzy dokładną fotomozaikę innego obrazu przy użyciu awatarów 48 × 48 pikseli z tej siatki 45 × 45.
Testuj obrazy
Oto zdjęcia testowe. Pierwszą jest oczywiście żarówka!
(Nie są tutaj pełnowymiarowe. Kliknij zdjęcie, aby wyświetlić je w pełnym rozmiarze. Połowy wielkości są dostępne dla Pocałunku , Niedzielnego popołudnia ... , Steve'a Jobsa i sfer .)
Dzięki Wikipedii za wszystkie sfery oprócz raytraced.
W pełnym rozmiarze wszystkie te obrazy mają wymiary podzielne przez 48. Większe musiały być plikami JPEG, aby można je było wystarczająco skompresować, aby je załadować.
Punktacja
To konkurs popularności. Zgłoszenie z mozaikami, które najdokładniej przedstawiają oryginalne obrazy, powinno zostać poddane pod głosowanie. Przyjmę najwyższą głosowaną odpowiedź za tydzień lub dwa.
Zasady
Twoja fotomozaika musi w całości składać się z niezmienionych awatarów 48 × 48 pikseli wziętych z powyższej mozaiki, ułożonych w siatkę.
Możesz ponownie użyć awatara w mozaice. (Rzeczywiście, w przypadku większych zdjęć testowych będziesz musiał.)
Pokaż swoje wyniki, ale pamiętaj, że obrazy testowe są bardzo duże, a StackExchange pozwala tylko na publikowanie obrazów do 2 MB . Więc skompresuj swoje zdjęcia lub umieść je gdzie indziej i umieść tutaj mniejsze wersje.
Aby zostać zwycięzcą, musisz dostarczyć wersje PNG mozaiki żarówki lub kulek. Dzięki temu mogę je zweryfikować (patrz poniżej), aby upewnić się, że nie dodajesz dodatkowych kolorów do awatarów, aby mozaiki wyglądały lepiej.
Walidator
Tego skryptu w Pythonie można użyć do sprawdzenia, czy ukończona mozaika rzeczywiście używa niezmienionych awatarów. Po prostu ustaw toValidate
i allTiles
. Jest mało prawdopodobne, aby działał w przypadku plików JPEG lub innych formatów stratnych, ponieważ porównuje dokładnie rzeczy, piksel po pikselu.
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))
Powodzenia wszystkim! Nie mogę się doczekać, aby zobaczyć wyniki.
Uwaga: wiem, że algorytmy fotomozaiczne są łatwe do znalezienia w Internecie, ale jeszcze ich nie ma na tej stronie. Naprawdę mam nadzieję, że zobaczymy coś bardziej interesującego niż zwykły algorytm „uśredniania każdego kafelka i każdego pola siatki i dopasowywania ich” .