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" .
sumber
Jawaban:
Jawa, jarak rata-rata
Algoritma melakukan pencarian melalui semua ubin avatar untuk setiap ruang kotak secara terpisah. Karena ukurannya yang kecil saya tidak mengimplementasikan struktur data yang canggih atau algoritma pencarian tetapi hanya memaksa seluruh ruang.
Kode ini tidak melakukan modifikasi apa pun pada ubin (mis. Tidak ada penyesuaian dengan warna tujuan).
Hasil
Klik untuk gambar ukuran penuh.
Efek jari-jari
Menggunakan
radius
Anda dapat mengurangi pengulangan ubin di hasilnya. Pengaturanradius=0
tidak ada efek. Misalnyaradius=3
menekan ubin yang sama dalam radius 3 ubin.radius = 0
radius = 3
Pengaruh faktor penskalaan
Menggunakan
scaling
faktor kita dapat menentukan bagaimana ubin yang cocok dicari.scaling=1
berarti mencari pasangan yang sempurna piksel sembariscaling=48
melakukan pencarian ubin rata-rata.skala = 48
skala = 16
penskalaan = 4
penskalaan = 1
sumber
Mathematica, dengan kontrol untuk granularity
Ini menggunakan foto 48 x 48 piksel, sesuai kebutuhan. Secara default, ini akan menukar piksel tersebut dengan 48x48 piksel persegi yang sesuai dari gambar untuk diperkirakan.
Namun, ukuran kotak tujuan dapat diatur agar lebih kecil dari 48 x 48, memungkinkan untuk kesetiaan yang lebih besar untuk detail. (lihat contoh di bawah).
Memproses ulang palet
collage
adalah gambar yang berisi foto untuk dijadikan sebagai palet.picsColors
adalah daftar foto individu yang dipasangkan dengan nilai rata-rata merah, rata-rata hijau, dan biru.Contoh
Mari kita cari foto yang paling cocok dengan RGBColor [0,640, 0,134, 0,249]:
photoMosaic
`photoMosaic mengambil sebagai masukan gambar mentah kita akan membuat mosaik foto.
targetPic
akan menghapus parameter keempat (PNG dan beberapa JPG), hanya menyisakan R, G, B.dims
adalah dimensitargetPic
.tiles
adalah kotak kecil yang bersama-sama membentuk gambar target.targetSwathSize is the granularity parameter; it defaults at 48 (x48).
tileReplacements
adalah foto yang cocok dengan setiap ubin, dalam urutan yang tepat.gallery
adalah himpunan penggantian ubin (foto) dengan dimensi yang tepat (yaitu jumlah baris dan kolom yang cocok dengan ubin).ImageAssembly
bergabung dengan mosaik menjadi gambar output yang berkelanjutan.Contohnya
Ini menggantikan setiap 12x12 persegi dari gambar, Minggu, dengan foto 48 x 48 piksel yang sesuai yang paling cocok dengan warna rata-rata.
Minggu (detail)
Detail, stevejobs.
Detail ciuman:
sumber
JS
Sama seperti pada golf sebelumnya: http://jsfiddle.net/eithe/J7jEk/ : D
(kali ini disebut dengan
unique: false, {pixel_2: {width: 48, height: 48}, pixel_1: {width: 48, height: 48}}
) (jangan perlakukan palet menggunakan satu piksel sekali, piksel palet adalah swatch 48x48, bentuk pixel adalah swatch 48x48).Saat ini ia mencari melalui daftar avatar untuk menemukan pencocokan terdekat berdasarkan berat dari algoritma yang dipilih, namun itu tidak melakukan pencocokan keseragaman warna (sesuatu yang perlu saya lihat.
Sayangnya saya tidak dapat bermain-main dengan gambar yang lebih besar, karena RAM saya habis: D Jika memungkinkan saya akan menghargai gambar yang lebih kecil. Jika menggunakan 1/2 dari ukuran gambar yang disediakan, ini Minggu Sore:
sumber
GLSL
Perbedaan antara tantangan ini dan tantangan di American Gothic dalam palet Mona Lisa: Atur ulang piksel membuat saya tertarik, karena ubin mosaik dapat digunakan kembali, sedangkan piksel tidak bisa. Ini berarti bahwa adalah mungkin untuk dengan mudah memparalelkan algoritma, jadi saya memutuskan untuk mencoba versi paralel besar-besaran. Dengan "secara besar-besaran" yang saya maksud menggunakan core shader 1344 di GTX670 desktop saya secara bersamaan, melalui GLSL.
metode
Pencocokan ubin sebenarnya sederhana: Saya menghitung jarak RGB antara setiap piksel di area target dan area ubin mosaik, dan memilih ubin dengan perbedaan terendah (dibobot oleh nilai kecerahan). Indeks ubin ditulis dalam atribut warna merah dan hijau dari fragmen, kemudian setelah semua fragmen telah diberikan saya membaca nilai-nilai kembali dari framebuffer dan membangun gambar output dari indeks tersebut. Implementasi yang sebenarnya cukup hack; alih-alih membuat FBO, saya hanya membuka jendela dan merendernya, tetapi GLFW tidak dapat membuka jendela dengan resolusi kecil yang sewenang-wenang, jadi saya membuat jendela lebih besar dari yang dibutuhkan, kemudian menggambar persegi panjang kecil yang merupakan ukuran yang benar sehingga memiliki satu fragmen per ubin yang memetakan ke gambar sumber. Seluruh solusi MSVC2013 tersedia dihttps://bitbucket.org/Gibgezr/mosaicmaker Membutuhkan GLFW / FreeImage / GLEW / GLM untuk dikompilasi, dan OpenGL 3.3 atau driver / kartu video yang lebih baik untuk dijalankan.
Sumber Fragmen Shader
Hasil
Gambar-gambar itu merender hampir seketika, sehingga paralelisasi itu sukses. Kelemahannya adalah saya tidak bisa membuat fragmen individu bergantung pada output dari fragmen lain, jadi tidak ada cara untuk mendapatkan peningkatan kualitas yang signifikan yang bisa Anda dapatkan dengan tidak memilih ubin yang sama dua kali dalam rentang tertentu. Jadi, hasil yang cepat, tetapi kualitas terbatas karena pengulangan ubin besar-besaran. Secara keseluruhan, itu menyenangkan. http://imgur.com/a/M0Db0 untuk versi ukuran penuh.
sumber
Python
Ini dia solusi Python pertama, menggunakan pendekatan yang berarti. Kita dapat berevolusi dari sini. Sisa gambar ada di sini .
sumber
Yet Another Python Solution - Rata-Rata Berbasis (RGB vs L a b *)
Hasil (Ada beberapa perbedaan)
Bulb - RGB
tampilan penuh
Bulb - Lab
tampilan penuh
Steve - RGB
tampilan penuh
Steve - Lab
tampilan penuh
Spheres - RGB
tampilan penuh
Spheres - Lab
tampilan penuh
Minggu - RGB
tampilan penuh
Minggu - Lab
tampilan penuh
Ciuman - RGB
tampilan penuh
Ciuman - Lab
tampilan penuh
Kode
membutuhkan python-colormath untuk Lab
sumber