Geser gambar skala abu-abu menjadi hitam putih murni dengan algoritme Anda sendiri.
Panduan: Anda harus membuat algoritma baru Anda sendiri. Anda tidak dapat menggunakan algoritme yang sudah ada sebelumnya (mis. Floyd-Steinburg) tetapi Anda dapat menggunakan teknik umum. Program Anda harus dapat membaca gambar dan menghasilkan gambar dengan ukuran yang sama. Ini adalah kontes popularitas, jadi siapa pun yang menghasilkan yang terbaik (paling dekat dengan aslinya) dan paling kreatif (ditentukan oleh suara) menang. Bonus jika kodenya pendek, meskipun ini tidak perlu.
Anda dapat menggunakan gambar skala abu-abu apa pun yang Anda inginkan sebagai input, ukurannya harus lebih besar dari 300x300. Semua format file baik-baik saja.
Input contoh:
Contoh output:
Ini adalah pekerjaan yang cukup bagus, tetapi masih ada garis dan pola yang terlihat.
Jawaban:
Fortran
Oke, saya menggunakan format gambar tidak jelas yang disebut FITS yang digunakan untuk astronomi. Ini berarti ada perpustakaan Fortran untuk membaca dan menulis gambar seperti itu. ImageMagick dan Gimp juga dapat membaca / menulis gambar FIT.
Algoritma yang saya gunakan didasarkan pada dithering "Sierra Lite", tetapi dengan dua peningkatan:
a) Saya mengurangi kesalahan yang diperbanyak dengan faktor 4/5.
b) Saya memperkenalkan variasi acak dalam matriks difusi sambil menjaga jumlah konstannya.
Bersama-sama ini hampir sepenuhnya menghilangkan pola yang terlihat dalam contoh OPs.
Dengan asumsi Anda memiliki perpustakaan CFITSIO diinstal, kompilasi dengan
Nama-nama file tersebut hard-coded (tidak bisa diganggu untuk memperbaikinya).
Kode:
Contoh output untuk gambar anak anjing di pos
OP : contoh output OP:
sumber
GraphicsMagick / ImageMagick
Dipesan di muka:
Sebelum mengeluh tentang penggunaan "algoritma mapan" saya, harap baca ChangeLog untuk GraphicsMagick dan ImageMagick untuk April 2003 di mana Anda akan melihat bahwa saya menerapkan algoritme dalam aplikasi tersebut. Juga, kombinasi "-gamma .45455" dengan "-ordered-dither" adalah baru.
"-Gamma .45455" menangani gambar yang terlalu terang. Parameter "semua" hanya diperlukan dengan GraphicsMagick.
Ada garis tepi karena hanya ada 17 tingkat abu-abu dalam gambar gentar beraturan 4x4. Tampilan pita dapat dikurangi dengan menggunakan 8x8 teratur-dither yang memiliki 65 level.
Berikut adalah gambar asli, output dithered yang dipesan 4x4 dan 8x8 dan output ambang-acak:
Saya lebih suka versi memerintahkan-gentar, tetapi saya termasuk versi ambang batas acak untuk kelengkapan.
"10x90%" berarti membuat piksel intensitas di bawah 10 persen sebagai hitam murni dan di atas 90 persen sebagai putih murni, untuk menghindari memiliki beberapa bintik kesepian di area tersebut.
Mungkin perlu dicatat bahwa keduanya seefisien-memori seperti yang seharusnya. Juga tidak ada difusi, sehingga mereka bekerja satu piksel pada satu waktu, bahkan ketika menulis blok teratur-gentar, dan tidak perlu tahu apa-apa tentang piksel tetangga. ImageMagick dan GraphicsMagick memproses satu baris setiap kali, tetapi tidak perlu untuk metode ini. Konversi terurut-surut waktu kurang dari 0,04 detik waktu nyata di komputer x86_64 lama saya.
sumber
Saya minta maaf untuk gaya kode, saya melemparkan ini bersama-sama menggunakan beberapa perpustakaan yang baru saja kita bangun di kelas java saya, dan memiliki kasus buruk copy-paste dan angka ajaib. Algoritme memilih persegi panjang acak dalam gambar, dan memeriksa apakah kecerahan rata-rata lebih besar pada gambar ragu-ragu atau gambar asli. Ini kemudian menghidupkan atau mematikan piksel untuk membawa kecerahan lebih dekat dalam garis, lebih disukai memilih piksel yang lebih berbeda dari gambar asli. Saya pikir itu melakukan pekerjaan yang lebih baik mengeluarkan detail tipis seperti rambut anak anjing, tetapi gambar lebih ribut karena mencoba mengeluarkan detail bahkan di daerah yang tidak ada.
sumber
Ghostscript (dengan sedikit bantuan ImageMagick)
Jauh dari menjadi 'algoritma baru saya sendiri', tetapi, maaf, tidak bisa menolaknya.
Tentu saja itu bekerja lebih baik tanpa pengekangan 'ukuran yang sama'.
sumber
JAWA
Ini kiriman saya. Mengambil gambar JPG, menghitung luminositas piksel per piksel (terima kasih kepada Bonan dalam pertanyaan SO ini ) dan kemudian memeriksanya dengan pola acak untuk mengetahui apakah piksel yang dihasilkan akan hitam atau putih. Piksel yang lebih gelap akan selalu hitam dan piksel yang paling cerah akan selalu berwarna putih untuk menjaga detail gambar.
Contoh lain:
Juga berfungsi dengan gambar penuh warna:
sumber
CJam
95 byte :)
Menggunakan format ASCII PGM (P2) tanpa garis komentar, baik untuk input maupun output.
Metode ini sangat mendasar: menambahkan kuadrat 2 * 2 piksel, mengkonversi ke kisaran 0,4, kemudian menggunakan pola 4 bit yang sesuai untuk menghasilkan 2 * 2 piksel hitam-putih.
Itu juga berarti lebar dan tinggi harus genap.
Mencicipi:
Dan algoritma acak hanya dalam 27 byte:
Ini menggunakan format file yang sama.
Mencicipi:
Dan akhirnya pendekatan campuran: dithering acak dengan bias terhadap pola kotak-kotak; 44 byte:
Mencicipi:
sumber
Java (1.4+)
Saya tidak yakin apakah saya menemukan kembali roda di sini tapi saya pikir itu mungkin unik ...
Dengan urutan acak terbatas
Dithering acak murni
Gambar kota dari jawaban Averroes
Algoritme menggunakan konsep energi luminositas lokal dan normalisasi untuk mempertahankan fitur. Versi awal kemudian menggunakan jitter acak untuk menghasilkan tampilan bingung atas area luminositas serupa. Namun itu tidak begitu menarik secara visual. Untuk mengatasi hal ini, serangkaian terbatas urutan acak terbatas dipetakan ke luminositas piksel input mentah dan sampel digunakan berulang dan berulang-ulang menghasilkan latar belakang tampak ragu-ragu.
sumber
Python
Idenya adalah sebagai berikut: Gambar akan dibagi menjadi
n x n
ubin. Kami menghitung warna rata-rata setiap ubin tersebut. Lalu kami memetakan rentang warna0 - 255
ke kisaran0 - n*n
yang memberi kami nilai baruv
. Lalu kami mewarnai semua piksel dari ubin hitam itu, danv
piksel warna secara acak di dalam ubin putih itu. Ini jauh dari optimal tetapi masih memberi kita hasil yang dapat dikenali. Bergantung pada resolusinya, biasanya berfungsi paling baik din=2
ataun=3
. Sementara di dalamn=2
Anda sudah dapat menemukan artefak dari 'kedalaman warna yang disimulasikan, kalau-n=3
kalau sudah bisa agak kabur. Saya berasumsi bahwa gambar harus tetap dengan ukuran yang sama, tetapi Anda tentu saja dapat juga menggunakan metode ini dan hanya menggandakan / tiga kali lipat ukuran gambar yang dihasilkan untuk mendapatkan rincian lebih lanjut.PS: Saya tahu bahwa saya agak terlambat ke pesta, saya ingat saya tidak punya ide ketika tantangan dimulai tetapi sekarang hanya gelombang otak ini =)
Hasil:
n=2:
n=3:
sumber
Mari kita tentukan format file teoretis yang sangat ringkas untuk pertanyaan ini karena format file yang ada memiliki terlalu banyak overhead untuk menulis jawaban cepat.
Biarkan empat byte pertama dari file gambar menentukan lebar dan tinggi gambar dalam piksel, masing-masing:
diikuti oleh
w * h
byte nilai grayscale dari 0 hingga 255:Kemudian, kita dapat mendefinisikan sepotong kode dengan Python (145 byte) yang akan mengambil gambar ini dan melakukan:
yang "dithers" dengan mengembalikan putih atau hitam dengan probabilitas sama dengan nilai skala abu-abu dari piksel itu.
Diterapkan pada gambar sampel, itu memberikan sesuatu seperti ini:
Ini tidak terlalu cantik, tetapi memang terlihat sangat mirip ketika diperkecil dalam pratinjau, dan hanya untuk 145 byte Python, saya tidak berpikir Anda bisa menjadi lebih baik.
sumber
Kobra
Mengambil file PNG / BMP 24-bit atau 32-bit (JPG menghasilkan output dengan beberapa abu-abu di dalamnya). Itu juga dapat diperluas ke file yang mengandung warna.
Ia menggunakan ELA yang dioptimalkan kecepatan untuk menggeser gambar menjadi warna 3-bit, yang akan kembali sebagai hitam / putih saat diberikan gambar uji Anda.
Apakah saya menyebutkan bahwa itu sangat cepat?
sumber
col
, dan membiarkanimage.setPixel(x,y,col)
sampai akhir?Jawa
Kode tingkat rendah, menggunakan PNGJ dan penambahan noise plus difusi dasar. Implementasi ini membutuhkan sumber PNG 8-bit skala abu-abu.
(Tambahkan toples ini ke jalur build Anda jika Anda ingin mencobanya).
Sebagai bonus: ini sangat efisien dalam penggunaan memori (hanya menyimpan tiga baris) sehingga dapat digunakan untuk gambar besar.
sumber
Jawa
Hanya algoritma berbasis RNG sederhana, ditambah beberapa logika untuk berurusan dengan gambar berwarna. Memiliki probabilitas b untuk mengatur setiap piksel yang diberikan menjadi putih, menetapkannya menjadi hitam sebaliknya; di mana b adalah kecerahan asli piksel itu.
Berikut adalah hasil potensial untuk gambar anjing:
sumber