Ketika mengurangi kedalaman warna dan dithering dengan noise 2 bit (dengan n =] 0,5,1.5 [dan output = lantai (input * (2 ^ bit-1) + n)), ujung rentang nilai (input 0,0 dan 1,0 ) berisik. Akan diinginkan untuk memilikinya menjadi warna solid.
Contoh: https://www.shadertoy.com/view/llsfz4
(di atas adalah tangkapan layar shadertoy, menggambarkan gradien dan kedua ujungnya yang masing-masing harus solid putih dan hitam, tetapi sebaliknya berisik)
Masalahnya tentu saja dapat diselesaikan dengan hanya mengompresi rentang nilai sehingga ujungnya selalu dibulatkan menjadi nilai tunggal. Ini terasa sedikit hack, dan saya bertanya-tanya apakah ada cara untuk menerapkan ini "dengan benar"?
image-processing
noise
hotmultimedia
sumber
sumber
Jawaban:
TL; DR: 2 * 1LSB istirahat dithering triangular-pdf dalam edgecases pada 0 dan 1 karena penjepitan. Solusinya adalah lerp ke seragam 1bit di edgecases tersebut.
Saya menambahkan jawaban kedua, mengingat ini ternyata sedikit lebih rumit dari yang saya kira. Tampaknya masalah ini telah menjadi "TODO: perlu dijepit?" dalam kode saya sejak saya beralih dari normalisasi menjadi dithering triangular ... pada 2012. Terasa senang akhirnya melihatnya :) Kode lengkap untuk solusi / gambar yang digunakan di seluruh pos: https://www.shadertoy.com/view/llXfzS
Pertama-tama, di sini adalah masalah yang sedang kita bahas, ketika menghitung sinyal menjadi 3bits dengan 2 * 1LSB dithering triangular-pdf:
- pada dasarnya apa yang ditampilkan hotmultimedia.
Semakin kontras, efek yang dijelaskan dalam pertanyaan menjadi jelas: Outputnya tidak rata-rata menjadi hitam / putih di edgecases (dan benar-benar melampaui 0/1 sebelum melakukannya).
Melihat grafik memberikan sedikit lebih banyak wawasan:
(garis abu-abu menandai 0/1, juga dalam abu-abu adalah sinyal yang kami coba untuk keluaran, garis kuning adalah rata-rata dari keluaran yang terkutuk / dikuantisasi, merah adalah kesalahan (rata-rata sinyal)).
Menariknya, tidak hanya output rata-rata tidak 0/1 pada batasnya, tetapi juga tidak linier (kemungkinan karena pdf segitiga dari kebisingan). Melihat ujung yang lebih rendah, masuk akal secara intuitif mengapa output menyimpang: Ketika sinyal ragu-ragu mulai memasukkan nilai-nilai negatif, clamping-on-output mengubah nilai dari bagian-bagian output yang berkerut rendah (yaitu nilai negatif), dengan demikian meningkatkan nilai rata-rata. Sebuah ilustrasi tampak berurutan (seragam, 2LSB simetris, rata-rata masih berwarna kuning):
Sekarang, jika kita hanya menggunakan 1LSB yang dinormalisasi, tidak ada masalah sama sekali, tapi tentu saja kita kehilangan sifat bagus dari dithering segitiga (lihat misalnya presentasi ini ).
Maka (hack) solusi (pragmatis, empiris), adalah kembali ke [-0,5; 0,5 [dithering seragam untuk edgecase:
Yang memperbaiki edgecases sambil menjaga dithering segitiga tetap utuh untuk rentang yang tersisa:
Jadi untuk tidak menjawab pertanyaan Anda: Saya tidak tahu apakah ada solusi yang lebih kuat secara matematis, dan sama-sama tertarik untuk mengetahui apa yang telah dilakukan Masters of Past :) Sampai saat itu, setidaknya kami memiliki peretasan yang mengerikan ini untuk menjaga kode kami berfungsi.
EDIT
Saya mungkin harus membahas saran-solusi yang diberikan dalam Pertanyaan, pada hanya menekan sinyal. Karena rata-rata tidak linier dalam edgecases, cukup mengompresi sinyal input tidak menghasilkan hasil yang sempurna - meskipun itu memperbaiki titik akhir:
Referensi
sumber
dithertri
dandithernorm
bukannya yang independen. Setelah Anda mengerjakan semua matematika dan membatalkan semua persyaratan, Anda akan menemukan bahwa Anda sama sekali tidak tertipu! Sebaliknya, kode bertindak seperti cutoff kerasv < 0.5 / depth || v > 1 - 0.5/depth
, langsung beralih ke distribusi seragam di sana. Bukan berarti itu menghilangkan dithering bagus yang Anda miliki, itu hanya rumit. Memperbaiki bug sebenarnya buruk, Anda akan berakhir dengan kehancuran yang lebih buruk. Cukup gunakan cutoff keras.Saya tidak yakin saya bisa sepenuhnya menjawab pertanyaan Anda, tetapi saya akan menambahkan beberapa pemikiran dan mungkin kita bisa sampai pada jawaban bersama :)
Pertama, dasar dari pertanyaan ini agak tidak jelas bagi saya: Mengapa Anda menganggap perlu untuk membersihkan hitam / putih ketika setiap warna lain memiliki noise? Hasil ideal setelah dithering adalah sinyal asli Anda dengan noise yang sepenuhnya seragam. Jika hitam dan putih berbeda, noise Anda menjadi bergantung pada sinyal (yang mungkin baik-baik saja, karena itu terjadi di mana warna tetap dijepit).
Yang mengatakan, ada beberapa situasi, di mana memiliki kebisingan baik putih atau hitam memang menimbulkan masalah (saya tidak mengetahui penggunaan kata-kata yang mengharuskan hitam dan putih secara bersamaan menjadi "bersih"): Ketika membuat partikel campuran aditif sebagai quad dengan tekstur, Anda tidak ingin noise ditambahkan di seluruh quad, karena itu akan menunjukkan tekstur di luar juga. Salah satu solusinya adalah dengan mengimbangi kebisingan, jadi daripada menambahkan [-0,5; 1,5 [Anda menambahkan [-2,0; 0,0 [(yaitu kurangi 2 bit noise). Ini merupakan solusi empiris, tetapi saya tidak mengetahui pendekatan yang lebih tepat. Berpikir tentang itu, Anda mungkin juga ingin meningkatkan sinyal Anda untuk mengimbangi kehilangan intensitas ...
Agak terkait, Timothy Lottes melakukan pembicaraan GDC pada pembentukan suara ke bagian dari spektrum di mana hal ini sangat diperlukan, mengurangi kebisingan di akhir terang spektrum: http://32ipi028l5q82yhj72224m8j-wpengine.netdna-ssl.com/wp- konten / unggah / 2016/03 / GdcVdrLottes.pdf
sumber
Saya telah menyederhanakan ide Mikkel Gjoel tentang dithering dengan noise segitiga menjadi fungsi sederhana yang hanya membutuhkan satu panggilan RNG. Saya telah menghapus semua bit yang tidak perlu sehingga harus mudah dibaca dan dimengerti apa yang terjadi:
Untuk gagasan dan konteksnya, saya akan merujuk Anda ke jawaban Mikkel Gjoel.
sumber
Saya mengikuti tautan ke pertanyaan luar biasa ini bersama dengan contoh shadertoy.
Saya punya beberapa pertanyaan tentang solusi yang disarankan:
Kerja bagus! Saya ingin melihat bahwa saya memahami garis pemikiran Anda dengan benar. Terima kasih!
sumber