ボケをシミュレートするためにどのアルゴリズムを使用できますか?


12

写真の各ピクセルをループし、画像全体にボケを適用するスクリプトを作成しようとしています。

このリンクに基づいてスクリプトを作成しましたが、それはハックのようです。

3つの入力画像があります:黒と白の深度マップ、写真、およびボケの「ブラシ」画像(現在は六角形です)。写真のすべてのピクセルに対して、ボケブラシをスタンプし、そのピクセルの中心とそのピクセルの色に合わせます。

見た目は...小さなボケブラシでは大丈夫ですが、ボケブラシのサイズを大きくすると、ガウスぼかしのように見えます。これが私のアルゴリズムでぼやけたタイムスクエアの写真です:

ここに画像の説明を入力してください

暗いエッジを気にしないで、私はそれを修正することができます。

ガウス分布とは異なると言えますが、それでもボケと呼ばれるものからは程遠い、鮮明なエッジがあります:

ここに画像の説明を入力してください

私のアルゴリズムがそれを行う理由を理解しています...どうすればボケをより正確にシミュレートできますか?


1
おそらくこれが役立つでしょう:ボケとガウスぼかしの違いは何ですか?
Imre

@Imre私は違いを理解しており、ボケは通常レンズによって引き起こされ、ガウスは後処理によって引き起こされますが、ボケをシミュレートしたいと思います。
エンティティ

@Entity:正確な深度マップを持つサンプル画像を探すにはどうすればよいですか?あなたのものは正確ですか?これを自分で試してみたい(決勝戦後)。たぶん数週間のうちに答えを出すでしょう。あなたのものが公開されている場合、私はそれへのリンクを持っていますか?
マーティンコートー

@MartijnCourteaux最初のテストでは、すべてがぼやけるようにフラットデプスマップを使用しています。単純なジオメトリ(テーブル上のカップなど)の場合、見栄えの良いデプスマップを作成するのはかなり簡単だと思います。より複雑な画像の場合、おそらく実際の深度マップが必要になります。これは、2つの画像から計算することも、単一の画像から計算することもできます。
エンティティ

回答:


20

主な問題はダイナミックレンジの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の標準でさえ数学的な観点から大幅に変更されます)、まったく異なる結果が得られます。


12

まず第一に、光学では、光のみが加算され、暗闇は加算されません。アルゴリズムが元の場所の外側に暗いピクセルをにじませないようにしてください。結果として得られるピクセルは、平均よりもむしろ近くのソースピクセルの最大値に似ているはずです。または、さらに正確に言うと、ソースピクセルに影響を与える対数を合計することになります。

エッジがシャープでない別の原因として考えられるのは、マスクのエッジがシャープでない場合です。参照として提供したページのアニメーションは誤解される可能性があるため、マスクでは元のピクセルは明るく、他のピクセルは徐々に暗くなります。これは、計算されたボケの濁ったエッジにも変換されます。写真では、開口部には明確なエッジがあり、緩やかなエッジはありません。したがって、実際にはマスク内のほとんどのピクセルは同じ明るさで、エッジ(ピクセルよりも滑らかなラインに色付けする必要がある部分)のみがグレーのシェードになります。

また、深度マップあることについても言及しいますが、それを使用することについての説明はありません。ボケマスクのサイズは、ピクセル深度および焦点面深度の差と相関する必要があります-ピクセルが焦点面から遠いほど(どちらの方向でも)、マスクは大きくなります。焦点面では、マスクサイズは1×1ピクセルである必要があります。


演算がすべて加算的である場合、暗い領域が広がるという問題は発生しません。鋭い円を得るには鋭いマスクが必要なのは事実ですが、主な問題は彼のボケ操作が非線形データに適用されていることです。
マットグラム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.