Anda diberi gambar warna yang benar. Tugas Anda adalah membuat versi gambar ini, yang terlihat seperti dicat menggunakan angka-angka (aktivitas anak-anak, bukan nonogram). Seiring dengan gambar, Anda diberi dua parameter: P , ukuran maksimum palet warna (yaitu jumlah maksimum warna berbeda untuk digunakan), dan N , jumlah sel maksimum untuk digunakan. Algoritme Anda tidak harus menggunakan semua warna P dan sel N , tetapi tidak boleh menggunakan lebih dari itu. Gambar output harus memiliki dimensi yang sama dengan input.
Sebuah sel didefinisikan sebagai daerah perbatasan dari pixel yang semua memiliki warna yang sama. Piksel yang menyentuh hanya di sudut tidak dianggap bersebelahan. Sel mungkin memiliki lubang.
Singkatnya, Anda harus memperkirakan gambar input dengan hanya N bidang teduh / warna solid dan P warna berbeda.
Hanya untuk memvisualisasikan parameter, berikut adalah contoh yang sangat sederhana (tanpa gambar input tertentu; memamerkan keterampilan Cat gila saya). Gambar berikut memiliki P = 6 dan N = 11 :
Berikut adalah beberapa gambar untuk menguji algoritme Anda (sebagian besar tersangka kami biasa). Klik gambar untuk versi yang lebih besar.
Harap sertakan beberapa hasil untuk parameter yang berbeda. Jika Anda ingin menunjukkan sejumlah besar hasil, Anda dapat membuat galeri di imgur.com , agar ukuran jawaban tetap masuk akal. Atau, letakkan gambar kecil di pos Anda dan buat tautan ke gambar yang lebih besar, seperti yang saya lakukan di atas. Juga, jangan ragu untuk menggunakan gambar uji lain, jika Anda menemukan sesuatu yang bagus.
Saya berasumsi bahwa parameter sekitar N ≥ 500 , P ~ 30 akan mirip dengan templat cat-by-number yang asli.
Ini adalah kontes popularitas, jadi jawabannya dengan suara terbanyak menang. Pemilih didorong untuk menilai jawaban oleh
- seberapa baik gambar aslinya diperkirakan.
- seberapa baik algoritma bekerja pada berbagai jenis gambar (lukisan mungkin umumnya lebih mudah daripada foto).
- seberapa baik algoritma bekerja dengan parameter yang sangat ketat.
- bagaimana organik / menghaluskan bentuk sel terlihat.
Saya akan menggunakan skrip Mathematica berikut, untuk memvalidasi hasil:
image = <pastedimagehere> // ImageData;
palette = Union[Join @@ image];
Print["P = ", Length@palette];
grid = GridGraph[Reverse@Most@Dimensions@image];
image = Flatten[image /. Thread[palette -> Range@Length@palette]];
Print["N = ",
Length@ConnectedComponents[
Graph[Cases[EdgeList[grid],
m_ <-> n_ /; image[[m]] == image[[n]]]]]]
Sp3000 cukup baik untuk menulis verifier di Python 2 menggunakan PIL, yang Anda temukan di pastebin ini .
sumber
Jawaban:
Python 2 dengan PIL ( Galeri )
Perbarui waktu! Pembaruan ini menampilkan algoritme penghalusan sederhana untuk membuat gambar terlihat lebih kabur. Jika saya memperbarui lagi saya harus mengubah sedikit kode saya, karena itu menjadi berantakan & saya hd 2 glf a fw thngs 2 mke t char lim.
Saya juga membuat warna berat k-means berdasarkan ukuran sel, yang kehilangan beberapa detail untuk parameter yang lebih ketat (misalnya pusat nebula dan garpu rumput Amerika Gothic) tetapi membuat pilihan warna keseluruhan lebih tajam dan lebih bagus. Menariknya, ia kehilangan seluruh latar belakang untuk bidang raytraced untuk P = 5.
Ringkasan algoritma:
Waktu pemrosesan untuk setiap gambar sangat tergantung pada ukuran dan kerumitannya, dengan waktu mulai dari 20 detik hingga 7 menit untuk gambar uji.
Karena algoritme menggunakan pengacakan (mis. Penggabungan, k-means), Anda bisa mendapatkan hasil berbeda pada proses yang berbeda. Berikut adalah perbandingan dua run untuk gambar bear, dengan N = 50 dan P = 10:
Catatan: Semua gambar di bawah ini adalah tautan. Sebagian besar gambar ini langsung dari jalankan pertama, tetapi jika saya tidak suka output saya membiarkan diri saya hingga tiga upaya untuk bersikap adil.
N = 50, P = 10
N = 500, P = 30
Tapi saya cukup malas dalam hal melukis dengan warna, jadi hanya untuk bersenang-senang ...
N = 20, P = 5
Selain itu, lucu melihat apa yang terjadi ketika Anda mencoba memeras 1 juta warna menjadi N = 500, P = 30:
Berikut langkah-langkah penelusuran algoritma untuk gambar bawah laut dengan N = 500 dan P = 30, dalam bentuk animasi GIF:
Saya juga membuat galeri untuk versi algoritma sebelumnya di sini . Inilah beberapa favorit saya dari versi terakhir (dari saat nebula memiliki lebih banyak bintang dan beruang tampak lebih berbulu):
sumber
im = im.convert("RGB")
diperlukan untuk beberapa foto. Saya akan memasukkannya setelah saya merestrukturisasi kode sedikit.Python 2 dengan PIL
Juga solusi Python dan mungkin sangat banyak pekerjaan yang sedang berjalan:
Algoritme mengikuti pendekatan yang berbeda dari SP3000, dimulai dengan warna terlebih dahulu:
Temukan palet warna warna P dengan k-means clustering dan cat gambar dalam palet yang diperkecil ini.
Gunakan sedikit filter median untuk menghilangkan noise.
Buat daftar semua sel monokromatik dan urutkan berdasarkan ukuran.
Gabungkan sel terkecil dengan tetangga terbesar masing-masing hingga hanya ada sel N yang tersisa.
Ada cukup ruang untuk perbaikan, baik dalam hal kecepatan dan kualitas hasil. Terutama langkah penggabungan sel dapat memakan waktu hingga beberapa menit dan memberi jauh dari hasil yang optimal.
P = 5, N = 45
P = 10, N = 50
P = 4, N = 250
P = 11, N = 500
sumber
Mathematica
Saat ini, ini membutuhkan jumlah warna dan jari-jari Gaussian untuk digunakan dalam filter Gaussian. Semakin besar radius, semakin besar buram dan penggabungan warna.
Karena tidak memungkinkan untuk input jumlah sel, itu tidak memenuhi salah satu persyaratan dasar dari tantangan.
Output mencakup jumlah sel untuk setiap warna dan juga jumlah total sel.
Memperbarui
quantImage2
memungkinkan untuk menentukan jumlah sel yang diinginkan sebagai input. Ini menentukan Radius Gaussian terbaik dengan perulangan melalui skenario dengan jari-jari yang lebih besar sampai ditemukan kecocokan yang dekat.quantImage2
output (gambar, sel yang diminta, sel yang digunakan, kesalahan, Radius gaussian digunakan).Namun, ini sangat lambat. Untuk menghemat waktu, Anda dapat mulai dengan radius awal, nilai defaultnya adalah 0.
Contoh yang kami tentukan jumlah sel yang diinginkan dalam output.
Contohnya meminta 90 sel dengan 25 warna. Solusi mengembalikan 88 sel, 2% kesalahan. Fungsi memilih jari-jari Gaussian 55. (Banyak distorsi).
Contoh yang inputnya termasuk jari-jari Gaussian, tetapi bukan jumlah sel.
25 Warna, radius Gaussian 5 piksel
Tiga Warna, radius 17 piksel
Dua puluh warna, radius 17 piksel
Kami meningkatkan jumlah warna tetapi tidak fokus. Perhatikan peningkatan jumlah sel.
Enam Warna, jari-jari 4 piksel
Malam berbintang
Dengan hanya 6 warna dan 60 sel. Ada ketidakcocokan warna dalam warna
showColors
klaim yang digunakannya. (Kuning tidak muncul di antara 5 warna tetapi digunakan dalam gambar.) Saya akan melihat apakah saya bisa mengetahuinya.sumber
showColors
, memutar melalui berbagai jumlah warna dan jari-jari dan memilih kombinasi yang paling mendekati jumlah sel yang diinginkan. Tidak yakin apakah saya punya gas untuk melakukan itu saat ini. Mungkin nanti.Python 2 dengan PIL
Ini masih agak dalam proses. Juga, kode di bawah ini adalah kekacauan spaghetti yang mengerikan, dan tidak boleh digunakan sebagai inspirasi. :)
Bagaimana itu bekerja
Program ini membagi kanvas menjadi beberapa
P
wilayah, yang masing-masing terdiri dari sejumlah sel tanpa lubang. Awalnya, kanvas hanya dibagi menjadi kotak perkiraan, yang secara acak ditugaskan ke daerah. Kemudian, wilayah ini "cacat" dalam proses berulang, di mana piksel yang diberikan dapat mengubah wilayahnya jikaKondisi terakhir dapat ditegakkan secara lokal, sehingga prosesnya sedikit seperti otomat seluler. Dengan cara ini, kita tidak perlu melakukan pathfinding atau semacamnya, yang mempercepat prosesnya. Namun, karena sel-sel tidak dapat dipecah, beberapa dari mereka berakhir sebagai "filamen" yang membatasi sel-sel lain dan menghambat pertumbuhan mereka. Untuk mengatasinya, ada proses yang disebut "potongan filamen", yang kadang-kadang memecah sel berbentuk filamen menjadi dua, jika ada kurang dari
N
sel pada waktu itu. Sel juga bisa menghilang jika ukurannya 1, dan ini membuat ruang untuk memotong filamen.Proses berakhir ketika tidak ada piksel yang memiliki insentif untuk beralih wilayah, dan setelah itu, setiap wilayah hanya diwarnai dengan warna rata-rata. Biasanya akan ada beberapa filamen yang tersisa di output, seperti yang dapat dilihat pada contoh di bawah ini, terutama di nebula.
P = 30, N = 500
Lebih banyak gambar nanti.
Beberapa sifat menarik dari program saya adalah bahwa itu probabilistik, sehingga hasilnya dapat bervariasi di antara berbagai proses, kecuali jika Anda menggunakan seed pseudorandom yang sama tentunya. Keacakan tidak penting, meskipun, saya hanya ingin menghindari artefak disengaja yang mungkin dihasilkan dari cara tertentu Python melintasi seperangkat koordinat atau sesuatu yang serupa. Program cenderung menggunakan semua
P
warna dan hampir semuaN
sel, dan sel tidak pernah mengandung lubang dengan desain. Juga, proses deformasi cukup lambat. Bola berwarna membutuhkan waktu hampir 15 menit untuk diproduksi di mesin saya. Pada terbalik, Anda menghidupkanGRAPHICAL_LOGGING
opsi, Anda akan mendapatkan serangkaian gambar keren dari proses deformasi. Saya membuat yang Mona Lisa menjadi animasi GIF (menyusut 50% untuk mengurangi ukuran file). Jika Anda melihat dari dekat ke wajah dan rambutnya, Anda dapat melihat proses pemotongan filamen.sumber