主な問題はダイナミックレンジの1つであると思います。アルゴリズムはおそらく正しいのですが、間違ったタイプのデータを扱っています。
そうでなければクリップして純粋な白になる点光源は、焦点がずれたレンズによってより広い領域に広がり、その結果、それほど明るくなく、したがってクリップしないディスクを形成します。
そのため、実際のボケ画像でこれらの素敵な円を取得できます。信号をクリップする(他の方法よりも明るさを下げてからボケシミュレーションで広げると、目立たないため現実的ではない薄暗い円(または六角形など)が得られます。
実際のイメージチェーンには次のものがあります。
bokeh (from the lens) -> digitisation (clipping) -> gamma correction & dynamic range compression
あなたがしているのは
sharp image -> digitisation (clipping) -> gamma correction & dynamic range compression -> bokeh simulation
線形データを使用していないため、正しい結果が得られません。
できることは、データの線形化、クリッピングで失われたダイナミックレンジの置換、ボケシミュレーションの実行、および非線形操作のやり直しです!
以下に例を示します。トーンマッピングされたHDRイメージから始めて、非常に非線形な結果が得られました。これは、ボケシミュレーションを試みるのに最も悪いタイプの画像です。
(photoshopのレンズぼかしツールを使用して)ボケをシミュレートする標準の畳み込み操作を行うと、この結果が得られます。
より良い結果を得るために、極端な曲線を適用して、トーンマッピング前の画像をおおむね元の状態に戻そうとしました。レベルツールを使用してこれを実行し、中央の入力を1.0から約0.2まで右に長く押しました。次に、前と同じようにレンズぼかしツールを適用しました。最後に、最初の曲線と反対方向に極端な曲線を適用しました。結果は、完璧からは程遠いものの、実際のレンズのボケのように見えます。
コードでこれを行っている場合は、各値を立方体化してから、ボケシミュレーションルーチンを適用してから、各値の立方根を取得します。改善が見られるはずです。微調整が必要な場合があります。
tl; drボケの完全な数学モデルを実装した場合でも、クリップされていない線形データに適用する必要があります。同じ計算を大幅に変更されたデータに適用すると(カメラJPEGの標準でさえ数学的な観点から大幅に変更されます)、まったく異なる結果が得られます。