MS Paint selalu merupakan pembuang waktu yang hebat, tetapi dijauhi oleh sebagian besar desainer grafis. Mungkin orang kehilangan minat karena palet warna yang menggelegar, atau karena tingkat undo yang terbatas. Apa pun itu, masih dimungkinkan untuk menghasilkan gambar yang indah hanya dengan kuas standar dan palet warna default.
Tantangan
Hanya menggunakan kuas default (kotak 4x4 tanpa sudut) dan palet warna default (28 warna di bawah), cobalah untuk mereplikasi gambar sumber menggunakan teknik yang didasarkan pada panjat bukit stokastik .
Algoritma
Setiap jawaban harus mengikuti algoritma dasar yang sama (stochastic hillclimb). Detail dapat diubah dalam setiap langkah. Suatu gerakan dianggap sebagai sapuan kuas (mis. Mengklik dalam cat).
- Tebak gerakan selanjutnya. Buat perkiraan (dari koordinat dan warna) untuk gerakan selanjutnya sesuai keinginan Anda. Namun tebakan itu tidak boleh merujuk gambar sumber.
- Terapkan tebakannya. Oleskan kuas ke lukisan untuk membuat gerakan.
- Ukur manfaat gerakan. Dengan mereferensikan gambar sumber, tentukan apakah gerakan menguntungkan lukisan itu (mis. Lukisan itu lebih mirip gambar sumber). Jika bermanfaat, pertahankan gerakan, buang gerakan itu.
- Ulangi sampai konvergensi. Lanjutkan ke Langkah 1 dan coba tebak berikutnya sampai algoritme terkonvergensi dengan cukup. Lukisan itu harus sangat menyerupai gambar sumber pada saat ini.
Jika program Anda tidak cocok dengan empat langkah ini, itu mungkin bukan stochastic hillclimb. Saya telah menandai ini sebagai kontes popularitas karena tujuannya adalah untuk menghasilkan algoritma lukisan yang menarik berdasarkan palet dan kuas warna yang terbatas.
Pengaduan
- Algoritme harus bersifat stokastik .
Tebakan berikutnya seharusnya tidak dipengaruhi oleh gambar sumber. Anda menebak setiap gerakan baru, dan kemudian memeriksa untuk melihat apakah itu membantu atau tidak. Misalnya, Anda tidak diizinkan menentukan di mana menempatkan kuas berdasarkan warna gambar sumber (yang mirip dengan dithering gambar sumber, yang bukan tujuannya).
Anda diizinkan untuk memengaruhi penempatan dengan mengubah langkah-langkah algoritme sesuai keinginan Anda. Misalnya, Anda dapat memulai tebakan di tepinya dan bergerak ke dalam, seret kuas untuk membuat garis untuk setiap tebakan, atau memutuskan untuk mengecat warna gelap terlebih dahulu. Anda diizinkan untuk mereferensikan gambar iterasi sebelumnya (tetapi bukan gambar sumber) untuk menghitung gerakan yang diinginkan berikutnya. Ini dapat membatasi seperti yang Anda inginkan (mis. Hanya membuat tebakan dalam kuadran kiri atas untuk iterasi saat ini).
Ukuran "perbedaan" antara gambar sumber dan iterasi saat ini dapat diukur sesuai keinginan Anda, asalkan tidak menghitung gerakan potensial lainnya untuk menentukan apakah gerakan ini dianggap sebagai "terbaik". Seharusnya tidak tahu apakah gerakan saat ini adalah yang "terbaik", hanya apakah gerakan itu sesuai dengan toleransi kriteria penerimaan. Misalnya, dapat sesederhana
abs(src.R - current.R) + abs(src.G - current.G) + abs(src.B - current.B)
untuk setiap piksel yang terpengaruh, atau salah satu teknik perbedaan warna yang terkenal .
Palet
Anda dapat mengunduh palet sebagai gambar 28x1 atau membuatnya langsung dalam kode.
Sikat
Kuas adalah kotak 4x4 tanpa sudut. Ini adalah versi skalanya:
(Kode Anda harus menggunakan versi 4x4)
Contoh
Memasukkan:
Keluaran:
Anda dapat melihat bagaimana algoritma dasar berkembang dalam video pendek yang saya buat (setiap frame adalah 500 iterasi): The Starry Night . Tahap-tahap awal menarik untuk ditonton:
sumber
Jawaban:
JavaScript
Solusi ini menggunakan elemen kanvas HTML5 untuk mengekstrak data gambar, tetapi tanpa perlu menggunakan HTML, itu berarti dapat dijalankan di konsol Anda. Ini mengakses gambar palet warna sebagai array; Saya menyimpan semua warna dari gambar palet dalam array). Ini output ke konsol (setelah selesai) dan juga menyimpan hasilnya dalam sebuah variabel.
Versi kode yang paling baru ada di biola . Biola juga menggunakan algoritma yang lebih baik untuk mengurangi noise pada gambar. Peningkatan dalam algoritma sebagian besar memperbaiki fungsi (maks ke menit) yang menyebabkan warna terbalik dipilih.
Kode dalam bentuk Ikon MS Paint! (kode yang diformat dalam biola atau Cuplikan Stack)
Pemakaian:
Biola .
Biola menggunakan crossorigin.me sehingga Anda tidak perlu khawatir tentang cross-origin-resource-sharing.
Saya juga memperbarui biola sehingga Anda dapat menyesuaikan beberapa nilai untuk menghasilkan lukisan yang paling cantik. Beberapa warna gambar mungkin mati, untuk menghindari ini, sesuaikan accept_rate untuk menyesuaikan algoritme. Angka yang lebih rendah berarti gradien yang lebih baik, angka yang lebih tinggi akan menghasilkan warna yang lebih tajam.
Ini biola sebagai Stack-Snippet (TIDAK diperbarui, jika biola tidak berfungsi):
Tampilkan cuplikan kode
Untuk mengenang flyby New Horizon tentang Pluto, saya telah memasukkan gambar Pluto:
Untuk yang berikut ini saya telah mengaturnya untuk membuat mereka menyerupai aslinya sedekat mungkin:
Saya menjalankan ini dengan wallpaper default OS X Yosemite. Setelah dibiarkan berjalan sedikit, hasilnya benar-benar menakjubkan. File asli sangat besar (26 MB) jadi saya mengubah ukuran dan mengompresnya:
Malam berbintang (Saya telah menggunakan gambar beresolusi lebih tinggi untuk hasil yang lebih baik)
Gambar yang saya temukan di google:
sumber
JavaScript + HTML
Acak:
Titik Acak
Acak Rata:
Membagi kanvas menjadi kotak 4x4, dan memilih titik secara acak di dalam salah satu kotak. Offset akan memindahkan grid, sehingga Anda dapat mengisi celah kecil.
Loop:
Membuat kisi dan Loop melalui semua poin. Offset menggerakkan grid. Spasi menentukan ukuran setiap sel. (Mereka akan mulai tumpang tindih)
Perbedaan warna:
RGB:
HSL:
HSV:
sumber
document.cookie
(setelah 1000 iterasi) karena dokumen tersebut di-sandbox. Apakah cookie itu perlu?doThing
sebagai gantiloop
. Anda mungkin menemukan peningkatan kecepatan sepadan dengan garis ekstra ...C # (implementasi referensi)
Ini adalah kode yang digunakan untuk menghasilkan gambar dalam pertanyaan. Saya pikir akan bermanfaat untuk memberikan beberapa orang referensi untuk mengatur algoritma mereka. Koordinat dan warna yang sepenuhnya acak dipilih untuk setiap gerakan. Ini berkinerja sangat baik mengingat keterbatasan yang diberlakukan oleh ukuran kuas / kriteria penerimaan.
Saya menggunakan algoritma CIEDE2000 untuk mengukur perbedaan warna, dari pustaka sumber terbuka ColorMine . Ini harus memberikan pencocokan warna yang lebih dekat (dari sudut pandang manusia) tetapi tampaknya tidak ada perbedaan yang nyata ketika digunakan dengan palet ini.
Kemudian Anda dapat menghasilkan serangkaian gambar (seperti video saya) dengan memanggil sebuah instance dengan cara yang mirip dengan kode di bawah ini (tweak berdasarkan jumlah iterasi / bingkai / nama yang diinginkan). Argumen pertama adalah path file ke gambar sumber, argumen kedua adalah path file ke palet (ditautkan dalam pertanyaan), dan argumen ketiga adalah path file untuk gambar output.
Saya mencari beberapa lukisan kanvas warna-warni online dan menemukan gambar-gambar di bawah ini, yang tampaknya merupakan gambar uji yang besar (rumit). Semua hak cipta milik masing-masing pemiliknya.
Sumber
Sumber
Sumber
sumber
Kanvas JavaScript
Memperbarui
Saran bagus di komentar. Sekarang lebih cepat dan tidak memperlambat ui!
sumber
Mathematica
Meskipun tidak secepat itu, tapi setidaknya itu membuat gambar yang samar-samar dikenali, jadi saya senang.
Keluaran:
Output mungkin bisa sedikit lebih baik dengan lebih banyak iterasi, dan masih banyak yang bisa saya coba untuk mempercepat / meningkatkan konvergensi, tetapi untuk saat ini sepertinya cukup bagus.
sumber
SmileBASIC
Gambar MSPAINT % [] , lebar% , tinggi% , langkah-langkah% OUT output% []
sumber