ガウスぼかしはどのように実装されますか?


42

ぼかしはリアルタイムグラフィックスで行われ、一方の軸で実行し、もう一方の軸で実行することを読みました。

過去に1Dで少し畳み込みを行ったことがありますが、これに非常に満足しているわけではありません。

誰もが画像の2Dガウスぼかしがどのように行われるかを簡単に説明できますか?

また、ぼかしの半径がパフォーマンスに影響を与える可能性があることも聞きました。それはより大きな畳み込みをしなければならないためですか?

回答:


48

畳み込みでは、2つの数学関数を組み合わせて3番目の関数を生成します。画像処理では、関数は通常カーネルと呼ばれます。カーネルは、ピクセルの(正方形の)配列(いわば小さな画像)にすぎません。通常、カーネルの値は1になります。これは、操作後に画像にエネルギーが追加または削除されないようにするためです。

具体的には、ガウスカーネル(ガウスぼかしに使用)は、ピクセル値がガウス曲線(2D)の値に対応するピクセルの正方配列です。

http://homepages.inf.ed.ac.uk/rbf/HIPR2/gsmooth.htmからリンクされた画像

画像の各ピクセルにガウスカーネルが乗算されます。これを行うには、カーネルの中心ピクセルを画像ピクセルに配置し、元の画像の値にカーネル内のオーバーラップするピクセルを乗算します。これらの乗算の結果の値が合計され、その結果が宛先ピクセルの値に使用されます。画像を見ると、入力配列の(0,0)の値にカーネル配列の(i)の値を乗算し、入力配列の(1,0)の値に(h)の値を乗算します)カーネル配列などに。そして、これらすべての値を追加して、出力画像で(1,1)の値を取得します。

http://www.songho.ca/dsp/convolution/convolution.htmlからリンクされた画像

2番目の質問に最初に答えるには、カーネルが大きいほど、操作が高価になります。そのため、ぼかしの半径が大きいほど、操作に時間がかかります。

最初の質問に答えるには、上記で説明したように、各入力ピクセルにカーネル全体を掛けることで畳み込みを行うことができます。ただし、カーネルが対称(ガウスカーネルの場合)であれば、各軸(xおよびy)を個別に乗算することもでき、乗算の総数が減ります。適切な数学用語では、マトリックスが分離可能な場合、(M×1)および(1×N)マトリックスに分解できます。上記のガウスカーネルの場合、次のカーネルも使用できることを意味します。

1256[1464141624164624362464162416414641]=1256[14641][14641]

ここで、入力イメージの各ピクセルに両方のカーネルを乗算し、結果の値を加算して出力ピクセルの値を取得します。

カーネルが分離可能かどうかを確認する方法の詳細については、このリンクを参照してください

編集:上記の2つのカーネルは、わずかに異なる値を使用します。これは、これらのカーネルを作成するためにガウス曲線に使用される(シグマ)パラメーターが両方の場合でわずかに異なっていたためです。どのパラメーターがガウス曲線の形状に影響するか、したがってカーネル内の値がこのリンクをたどる説明については

編集:上の2番目の画像では、使用されているカーネルが反転していることが示されています。もちろん、これは、使用するカーネルが対称でない場合にのみ違いを生じます。カーネルを反転する必要がある理由は、畳み込み演算の数学的特性に関係しています(畳み込みの詳細については、リンクを参照してください)。簡単に言えば、カーネルを反転させない場合、畳み込み演算の結果は反転します。カーネルを反転させると、正しい結果が得られます。


1
2つの異なる5 x 5カーネルの数値がわずかに異なる(1つは273、もう1つは256)理由を簡単に説明してください。これは新しい人にとって混乱の可能性があるようです。
-trichoplax

同様に、2番目の図でカーネルが反転している理由を説明できますか?私はそれが説明に関連しているとは思わないが、それが明らかに余分なステップであるという事実は、それが必要でないことを知らない誰かへの理解を妨げるかもしれない。
-trichoplax

正しい結果を得るために線形色空間で作業することを忘れないでください。
v.oddou

16

これは私がこのトピックに関して読んだ中で最高の記事です: 線形サンプリングによる効率的なガウスぼかし。それはあなたのすべての質問に対処し、本当にアクセス可能です。

簡単な説明:ガウスは分離可能であるという優れた特性を持つ関数です。つまり、2次元のガウス関数は、2つの1次元のガウス関数を組み合わせて計算できます。

n×nOn22×nOn

nn


13

一般に、コンボリューションはスライディングウィンドウで2つの関数の積の積分を取ることによって実行されますが、数学のバックグラウンドではない場合、それはあまり有用な説明ではなく、確かに有用な直感を与えませんそれのための。より直感的には、畳み込みにより、入力信号の複数のポイントが出力信号の単一のポイントに影響を与えることができます。

畳み込みにあまり慣れていないので、まずこのような離散コンテキストで畳み込みが何を意味するかを確認してから、より単純なぼかしを見てみましょう。

離散コンテキストでは、対応する各サンプルを乗算するだけで2つの信号を乗算できます。積分も離散的に行うのが簡単です。積分する間隔で各サンプルを合計するだけです。1つの単純な離散畳み込みは、移動平均の計算です。10個のサンプルの移動平均を取得する場合、10個の長さと0.1個の高さの分布で信号を畳み込むと考えることができます。ウィンドウ内の各サンプルはまず0.1で乗算され、10個すべてが加算されて生成されます平均。また、これは興味深い重要な違いを明らかにします。畳み込みでぼやけている場合、使用する分布はそのサンプル全体で合計1.0になるはずです。そうしないと、適用するときに画像の全体的な明るさが増減します。

畳み込みを確認したので、ぼかしに移ります。ガウスぼかしは、画像をガウス分布で畳み込むことで実装されます。他のぼかしは、通常、他の分布で画像を畳み込むことによって実装されます。最も単純なぼかしはボックスぼかしであり、上で説明したのと同じ分布、単位面積を持つボックスを使用します。10x10の領域をぼかす場合は、ボックス内の各サンプルに0.01を乗算し、それらを合計して中心ピクセルを生成します。画像が明るくなったり暗くなったりしないように、ぼかし分布のすべてのサンプルの合計が1.0であることを確認する必要があります。

r

eバツ2/22π

もちろん、ぼかしを計算するために多くのピクセルをサンプリングする必要があるため、これらのプロセスは両方とも非常に大きな半径で実行すると非常に高価になる可能性があります。これが最終的なトリックの出番です。ガウスぼかしとボックスぼかしの両方が「分離可能な」ぼかしと呼ばれるものです。つまり、一方の軸に沿ってブラーを実行し、次にもう一方の軸に沿って実行すると、両方の軸に沿って同時に実行した場合とまったく同じ結果が得られます。これは非常に重要です。ぼかしの幅が10ピクセルの場合、単純な形式で100個のサンプルが必要ですが、分離した場合は20個だけです。結合されたブラーはであるため、差は大きくなるだけです。On2On


1
あなたの他の答えを見ると、数学の背景は私が取り組んでいたよりも優れているように見えますが、役立つように十分に詳細に説明されることを願っています。私は、あらゆる背景の人々がこれに参加するのに役立つことを望んでいました。
-porglezomp

1
あなたが私と話をしているのであれば、まったくそうではありません。あなたの答えとバートは驚くほど啓発的です。どうもありがとうございます!今すぐ情報を消化する必要があります(:
アランウルフ

11

On2On

ただし、実際の実装で考慮する必要があるかもしれないさらに2つのトリックがあります。

フィルターには一定の半径があります。そのため、境界では画像の外側にあるピクセルで計算する必要があります。外側のピクセルのために、あなたは、単にのように、非常に国境で最後の可能な値(すなわちピクセルを取る:そのような場合には、次のいずれかを試みることができるmax(x, 0)またはあなたは、のように(外に向けた画像を「反映」でした。x < 0 ? -x : x)。または、単に境界で停止することもできますが、畳み込みフィルターの分母を調整して合計が1になるようにする必要があります。次に例を示します。

1256[1464141624164624362464162416414641]=1225[0000001624160024361600162416000000]=1。
     1
    1 1
   1 2 1
  1 3 3 1
[1 4 6 4 1]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.