Mereproduksi gambar dengan primitif geometris.
Gambar target disediakan sebagai input. Algoritma ini mencoba menemukan bentuk tunggal paling optimal yang dapat ditarik untuk meminimalkan kesalahan antara gambar target dan gambar yang ditarik. Ini mengulangi proses ini, menambahkan satu bentuk pada satu waktu . Sekitar 50 hingga 200 bentuk diperlukan untuk mencapai hasil yang dapat dikenali namun artistik dan abstrak.
Sekarang tersedia sebagai aplikasi Mac asli!
https://primitive.lol/
Ikuti @PrimitivePic di Twitter untuk melihat gambar primitif baru setiap 30 menit!
Bot Twitter mencari foto -foto menarik menggunakan Flickr API, menjalankan algoritma menggunakan parameter acak, dan memposting gambar menggunakan API Twitter.
Anda dapat men -tweet gambar ke bot dan itu akan memprosesnya untuk Anda.
Jalankan di gambar Anda sendiri! Pertama, instal Go.
go get -u github.com/fogleman/primitive
primitive -i input.png -o output.png -n 100
Gambar input kecil harus digunakan (seperti 256x256px). Anda tidak memerlukan detailnya dan kode akan berjalan lebih cepat.
Bendera | Bawaan | Keterangan |
---|---|---|
i | n/a | file input |
o | n/a | file output |
n | n/a | jumlah bentuk |
m | 1 | Mode: 0 = Combo, 1 = Triangle, 2 = Rect, 3 = Ellipse, 4 = Circle, 5 = RotatedRect, 6 = Beziers, 7 = Rotatedellipse, 8 = Polygon |
rep | 0 | Tambahkan N Bentuk Ekstra Setiap iterasi dengan pencarian yang dikurangi (kebanyakan baik untuk beziers) |
nth | 1 | Simpan setiap bingkai n (hanya ketika %d berada di jalur output) |
r | 256 | Ubah ukuran gambar input besar ke ukuran ini sebelum diproses |
s | 1024 | Ukuran gambar output |
a | 128 | Color Alpha (gunakan 0 untuk membiarkan algoritma memilih alpha untuk setiap bentuk) |
bg | rata -rata | Mulai warna latar belakang (hex) |
j | 0 | Jumlah pekerja paralel (default menggunakan semua core) |
v | mati | output verbose |
vv | mati | output yang sangat bertele -tele |
Bergantung pada ekstensi nama file output yang disediakan, Anda dapat menghasilkan berbagai jenis output.
PNG
: output rasterJPG
: output rasterSVG
: output vektorGIF
: Output animasi yang menunjukkan bentuk yang ditambahkan - membutuhkan Imagemagick (khususnya perintah convert
) Untuk output PNG dan SVG, Anda juga dapat memasukkan %d
, %03d
, dll. Dalam nama file. Dalam hal ini, setiap bingkai akan disimpan secara terpisah.
Anda dapat menggunakan bendera -o
beberapa kali. Dengan cara ini Anda dapat menyimpan PNG dan SVG, misalnya.
GIF ini menunjukkan sifat berulang dari algoritma, berusaha untuk meminimalkan kesalahan kuadrat rata -rata dengan menambahkan satu bentuk pada satu waktu. (Gunakan file output ".gif" untuk menghasilkan sendiri!)
Karena algoritma memiliki komponen acak, Anda dapat menjalankannya dengan gambar input yang sama beberapa kali untuk menghidupkan gambar statis.
Jika Anda mau mencoba -coba kode, Anda dapat menegakkan kendala pada bentuk untuk menghasilkan hasil yang lebih menarik. Di sini, persegi panjang dibatasi untuk menunjuk ke arah matahari dalam gambar matahari terbenam piramida ini.
Matriks di bawah ini menunjukkan segitiga, elips dan persegi panjang pada masing -masing 50, 100 dan 200 iterasi.
Katakanlah kami memiliki Target Image
. Inilah yang kami kerjakan untuk menciptakan kembali. Kami mulai dengan kanvas kosong, tetapi kami mengisinya dengan warna solid tunggal. Saat ini, ini adalah warna rata -rata Target Image
. Kami menyebut kanvas kosong baru ini Current Image
. Sekarang, kami mulai mengevaluasi bentuk. Untuk mengevaluasi bentuk, kami menggambarnya di atas Current Image
, menghasilkan New Image
. New Image
ini dibandingkan dengan Target Image
untuk menghitung skor. Kami menggunakan kesalahan root-mean-square untuk skor.
Current Image + Shape => New Image
RMSE(New Image, Target Image) => Score
Bentuk dihasilkan secara acak. Kami dapat menghasilkan bentuk acak dan mencetaknya. Kemudian kita dapat bermutasi bentuk (dengan mengubah titik segitiga, mengubah jari -jari elips atau tengah, dll.) Dan skor lagi. Jika mutasi meningkatkan skor, kami menyimpannya. Kalau tidak, kami mundur ke negara bagian sebelumnya. Mengulangi proses ini dikenal sebagai pendakian bukit. Panjat bukit cenderung terjebak dalam minimum lokal, jadi kami benar -benar melakukan ini berkali -kali dengan beberapa bentuk awal yang berbeda. Kami juga dapat menghasilkan bentuk n acak dan memilih yang terbaik sebelum kami mulai mendaki bukit. Simulasi anil adalah pilihan lain yang baik, tetapi dalam tes saya saya menemukan teknik pendakian bukit sama baik dan lebih cepat, setidaknya untuk masalah khusus ini.
Setelah kami menemukan bentuk skor yang baik, kami menambahkannya ke Current Image
, di mana ia akan tetap tidak berubah. Kemudian kita memulai proses lagi untuk menemukan bentuk berikutnya untuk menggambar. Proses ini diulang sebanyak yang diinginkan.
Primitif berikut didukung:
Lebih banyak bentuk dapat ditambahkan dengan mengimplementasikan antarmuka berikut:
type Shape interface {
Rasterize () [] Scanline
Copy () Shape
Mutate ()
Draw ( dc * gg. Context )
SVG ( attrs string ) string
}
Proyek ini awalnya terinspirasi oleh karya populer dan luar biasa Roger Johansson - Pemrograman Genetika: Evolusi Mona Lisa. Sejak melihat artikel itu ketika itu cukup baru, saya bermain -main dengan masalah ini di sana -sini selama bertahun -tahun. Tapi hanya sekarang saya puas dengan hasil saya.
Perlu dicatat bahwa ada perbedaan yang signifikan dalam implementasi saya dibandingkan dengan karya asli Roger. Milik saya bukanlah algoritma genetika. Milik saya hanya beroperasi pada satu bentuk pada satu waktu. Milik saya jauh lebih cepat (AFAIK) dan mendukung banyak jenis bentuk.
Berikut adalah lebih banyak contoh dari foto menarik yang ditemukan di Flickr.