Algoritma apa yang dapat saya gunakan untuk mensimulasikan bokeh?

12

Saya mencoba menulis skrip yang memotong setiap piksel dalam sebuah foto dan menerapkan bokeh pada gambar secara keseluruhan.

Saya membuat skrip berdasarkan tautan ini , namun itu tampaknya merupakan peretasan.

Saya memiliki tiga gambar input: peta kedalaman hitam dan putih, foto, dan gambar "sikat" bokeh (yang saat ini merupakan segi enam). Untuk setiap piksel foto, saya mencap kuas bokeh sehingga berpusat pada piksel itu dan dalam warna piksel itu.

Kelihatannya ... oke pada sikat bokeh kecil, tapi begitu saya meningkatkan ukuran sikat bokeh akhirnya terlihat seperti gaussian blur. Berikut adalah gambar kali kuadrat dengan algoritme saya:

masukkan deskripsi gambar di sini

Nevermind the dark edge, saya bisa memperbaikinya.

Anda bisa mengatakan itu berbeda dari gaussian, tetapi masih jauh dari apa yang bisa disebut bokeh, dengan tepi yang tajam:

masukkan deskripsi gambar di sini

Saya mengerti mengapa algoritma saya melakukan apa yang dilakukannya ... bagaimana saya bisa mensimulasikan bokeh secara lebih akurat?

Kesatuan
sumber
1
Mungkin ini akan membantu: Apa perbedaan antara Bokeh dan Gaussian Blur?
Imre
@Imre Saya mengerti perbedaannya, dan bahwa Bokeh biasanya disebabkan oleh lensa, dan Gaussian oleh pasca-pemrosesan, tetapi saya ingin mensimulasikan Bokeh.
Entitas
@Entity: Bagaimana cara mencari sampel gambar dengan peta kedalaman yang akurat? Apakah Anda akurat? Saya ingin mencoba ini sendiri (setelah final). Mungkin saya akan mendapat jawaban dalam beberapa minggu kemudian. Jika milik Anda bersifat publik, dapatkah saya memiliki tautan ke sana?
Martijn Courteaux
@ MartijnCourteaux Untuk pengujian awal saya, saya hanya menggunakan peta kedalaman datar sehingga semuanya buram. Untuk geometri sederhana (misalnya cangkir di atas meja) saya pikir akan cukup sederhana untuk membuat peta kedalaman yang terlihat bagus. Untuk gambar yang lebih kompleks, Anda mungkin membutuhkan peta kedalaman nyata. Ini dapat dihitung dari dua gambar, atau bahkan hanya dari satu gambar Anda .
Entitas

Jawaban:

20

Saya pikir masalah utamanya adalah rentang dinamis, algoritme Anda mungkin benar tetapi Anda bekerja pada tipe data yang salah.

Sumber cahaya titik yang jika tidak bisa klip dan pergi putih murni akan tersebar di area yang lebih besar oleh lensa yang tidak fokus, sehingga membentuk disk yang tidak secerah itu dan karena itu tidak klip.

Itu sebabnya Anda mendapatkan lingkaran-lingkaran bagus itu di gambar bokeh asli Anda. Jika Anda memotong sinyal (membuatnya kurang terang dari yang seharusnya dan kemudian menyebar dengan simulasi bokeh Anda, Anda mendapatkan lingkaran redup (atau segi enam, atau apa pun) yang tidak menonjol dan dengan demikian tidak terlihat realistis.

Apa yang Anda miliki dalam rantai gambar nyata adalah:

bokeh (from the lens) -> digitisation (clipping) -> gamma correction & dynamic range compression

Apa yang kamu lakukan adalah

sharp image -> digitisation (clipping) -> gamma correction & dynamic range compression -> bokeh simulation

Anda tidak akan mendapatkan hasil yang benar karena Anda tidak bekerja dengan data linier.

Apa yang dapat Anda lakukan adalah mencoba untuk meluruskan data, mengganti rentang dinamis apa pun yang hilang akibat kliping, melakukan simulasi bokeh Anda, dan kemudian mengulang operasi nonlinier!

Ini sebuah contoh. Saya sudah mulai dengan gambar HDR yang telah dipetakan, memberikan hasil yang sangat nonlinier. Ini adalah jenis gambar terburuk untuk dicoba dengan simulasi bokeh!

Melakukan operasi konvolusi standar untuk mensimulasikan bokeh (menggunakan alat blur lensa photoshop) menghasilkan hasil ini, yang sangat mirip dengan apa yang Anda dapatkan:

Untuk mendapatkan hasil yang lebih baik, saya menerapkan kurva ekstrem untuk mencoba dan mendapatkan gambar kembali ke kira-kira seperti apa sebelum tonemapping, di mana highlight jauh, lebih terang daripada sisa gambar. Saya melakukan ini dengan dengan alat level, mendorong input tengah jauh ke kanan, dari 1,0 menjadi sekitar 0,2). Saya kemudian menerapkan alat blur lensa, seperti sebelumnya. Akhirnya saya menerapkan kurva ekstrem ke arah yang berlawanan dengan kurva pertama. Hasilnya, meski jauh dari sempurna, jauh lebih mirip bokeh lensa asli:

 

Jika Anda melakukan ini dalam kode, maka coba cubing setiap nilai, lalu terapkan simulasi bokeh rutin Anda, lalu ambil akar pangkat tiga dari setiap nilai. Anda akan melihat peningkatan. Mungkin perlu beberapa penyesuaian.

tl; dr bahkan jika Anda telah menerapkan model matematika bokeh yang sempurna, itu harus diterapkan pada data linier yang tidak terpotong. Jika Anda menerapkan perhitungan yang sama untuk data yang sangat dimodifikasi (bahkan standar dalam kamera JPEG sangat dimodifikasi dari sudut pandang matematika) Anda akan mendapatkan hasil yang sangat berbeda.

Matt Grum
sumber
12

Pertama-tama, dalam optik, hanya cahaya yang bertambah dan kegelapan tidak. Pastikan algoritme Anda tidak mengeluarkan piksel gelap keluar dari lokasi aslinya. Piksel yang dihasilkan harus menyerupai maksimum piksel sumber terdekat daripada rata-rata. Atau, lebih tepatnya, Anda akan menjumlahkan logaritma yang memengaruhi piksel sumber.

Kemungkinan penyebab lain mengapa tepi Anda mungkin tidak tajam adalah jika tepi topeng Anda tidak tajam. Animasi di halaman yang Anda berikan sebagai referensi bisa disalahpahami sehingga dalam topeng, piksel asli cerah dan yang lainnya secara bertahap lebih gelap. Ini akan menerjemahkan ke tepi berlumpur dalam bokeh yang dihitung juga. Dalam fotografi, lubang memiliki tepi yang pasti, bukan yang bertahap. Jadi sebenarnya sebagian besar piksel dalam topeng harus memiliki kecerahan yang sama dan hanya tepi (di mana kurang dari satu piksel harus diwarnai untuk garis yang halus) dapat menjadi beberapa warna abu-abu.

Anda juga menyebutkan memiliki peta kedalaman, tetapi tidak ada kata tentang menggunakannya . Ukuran topeng bokeh Anda harus berkorelasi dengan kedalaman piksel dan perbedaan kedalaman bidang fokus - semakin jauh piksel berasal dari bidang fokus (di kedua arah), semakin besar topengnya. Pada bidang fokus, ukuran topeng harus 1 × 1 piksel.

Imre
sumber
Asalkan semua operasi aditif Anda tidak akan mendapatkan masalah area gelap menyebar. Memang benar Anda membutuhkan topeng yang tajam untuk mendapatkan lingkaran yang tajam, tetapi masalah utama adalah bahwa operasi bokehnya diterapkan pada data non-linear.
Matt Grum