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.