Tugas Anda adalah menulis sebuah program yang mengambil gambar input dan menjalankannya melalui deteksi tepi untuk menjadi gambar keluaran.
Deteksi tepi berfungsi sebagai berikut (jika tidak jelas, lihat deteksi tepi sobel ):
- Nilai piksel adalah kecerahan total piksel, jadi jika warnanya berwarna, Anda harus mengonversinya menjadi skala abu-abu terlebih dahulu (untuk menjaga hal-hal sederhana dan golf-bisa, Anda dapat mengambil nilai rata-rata untuk R, G dan B).
- Rumus untuk G x dan G y untuk piksel p (i, j) adalah:
- G x = -1 * p (i-1, j-1) - 2 * p (i-1, j) - 1 * p (i-1, j + 1) + 1 * p (i + 1, j -1) + 2 * p (i + 1, j) + 1 * p (i + 1, j + 1)
- G y = -1 * p (i-1, j-1) - 2 * p (i, j-1) - 1 * p (i + 1, j-1) + 1 * p (i-1, j +1) + 2 * p (i, j + 1) + 1 * p (i + 1, j + 1)
- Nilai untuk ukuran edge pada pixel tersebut adalah: √ (G x 2 + G y 2 )
Gambar output untuk setiap piksel ukuran tepi √ (G x 2 + G y 2 ) sebagai skala abu-abu.
Bonus:
- Lakukan gaussian blur untuk menghaluskan gambar sebelum deteksi tepi dilakukan, untuk menghilangkan tepi yang lebih kecil. Ini memberikan bonus -30% pada hasil akhirnya.
- Ambil sudut dari tepi di akun. Anda memberi piksel keluaran beberapa warna, dengan mengambil nilai skala abu-abu yang sama dan menambahkan warna dari roda warna menggunakan sudut yang diperoleh dari rumus arctan (G y / G x ). Ini memberikan bonus lain sebesar -30% pada hasil akhirnya.
Aturan:
- Anda dapat menghilangkan nilai edgepixels, dan mengaturnya menjadi hitam, atau Anda dapat menggunakan 0 untuk piksel di luar gambar.
- Gambar ouput Anda harus dalam format gambar yang dapat dibuka di sebagian besar komputer.
- Keluaran harus ditulis ke disk atau dapat dikirimkan ke file.
- Input diberikan sebagai argumen baris perintah, dalam bentuk jalur relatif ke gambar, atau disalurkan dari baris perintah.
- Ini kode golf, jadi kode terpendek dalam byte menang!
Jawaban:
J,
166 164 161 154 150 144143 byte.Tidak bermain golf terlalu banyak; Saya sebagian besar menciutkan implementasi saya yang lebih lama (lihat di bawah), jadi mungkin ada banyak ruang untuk perbaikan. Menggunakan perpustakaan BMP. Menghemat menghasilkan file
o
. Saya menangani edgepixels dengan hanya menggunakan sel 3x3 penuh, sehingga gambar akhir memiliki lebar dan tinggi lebih kecil 2 piksel.Pemakaian:
Diperluas:
Input dan output sampel:
sumber
;._3
operator subarray. Saya perhatikan Anda mendefinisikan kata kerjap
dengan peringkat 2 untuk beroperasi pada subarrays setelah Anda membuatnya. Sebagai gantinya Anda bisa beroperasi pada setiap subarray saat Anda memotong. Usaha saya menerapkannya berdasarkan pekerjaan Anda256#.3#"0<.255<.3 3((|:S)&*+&.*:&(+/)&,S&*);._3%&3(3#256)+/@#:
. Itu harus membawanya ke total 126 byte.'o'writebmp~256#.3#"0<.255<.3 3(*+&.*:&(+/)&,(*|:))&((-,.0,.])1 2 1);._3%&3(3#256)+/@#:readbmp]stdin''
asumsi bahwa hanya nama file yang diinput pada stdin. Anda dapat melakukan ini menggunakanecho -n
sehingga baris baru tambahan tidak termasuk dalam stdin. Di komputer saya, skrip keluar secara otomatis saat menggunakan input pipa ke skrip yang berarti saya tidak harus menyertakanexit''
dan dapat menyimpan 6 byte tambahan, tetapi saya tidak yakin apakah ini benar untuk semua.Python, 161 * 0.7 = 112.7 byte
Dengan bonus Gaussian Blur.
Karena Anda tidak secara eksplisit melarang metode bawaan, berikut adalah OpenCV:
Tanpa bonus, 136 byte
sumber
MATLAB, 212 * 0.4 = 84.8 byte
Menggunakan kotak alat filter dan ruang warna HSV
atau ungolfed
sumber
Love2D Lua, 466 Bytes
Mengambil input baris perintah, menghasilkan file bernama "o" di bawah folder data Love2D apps Anda. Love2D tidak akan membiarkan Anda menyimpan file di tempat lain.
Hampir seperti golf yang saya bisa dapatkan, mungkin bisa golf lebih jauh.
Dijelaskan
Uji
Dan...
Meskipun itu tidak benar-benar meningkatkan skor saya (Membuatnya lebih buruk), berikut adalah versi dengan roda warna yang diimplementasikan.
900 - 270 = 630 Bytes
sumber