Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Gaussian Blur

2025年09月12日に「Dev.to」が公開したITニュース「Gaussian Blur」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

ガウシアンブラーは、ガウス関数(正規分布)を用いて画像を自然にぼかす技術だ。中心のピクセルほど影響を強くする重み(カーネル)を計算し、画像を畳み込み演算で処理する。これにより、色の情報を保ちつつ滑らかなぼかしを実現できる。ぼかしの強さはシグマで調整する。

出典: Gaussian Blur | Dev.to公開日:

ITニュース解説

ガウシアンブラーは、画像を自然にぼかすための非常に一般的な技術の一つだ。特に、画像の中から特定のパターンや特徴を検出する際の前処理として利用されることが多い。例えば、画像の輪郭をはっきりとさせるエッジ検出のような処理を行う前に、画像に含まれるノイズを減らし、主要な線や形がより明確になるように画像を滑らかにする目的で使われる。この方法でぼかすと、単に画像を不明瞭にするだけでなく、色情報が損なわれることなく、自然で滑らかな見た目のぼかし効果が得られるという特徴がある。従来のぼかし方法として知られるボックスブラーが、単純に周辺のピクセルの色を平均するのに対し、ガウシアンブラーは「正規分布」という数学的な考え方に基づいているため、中心に近いピクセルほど強く影響を与えるようにぼかしを適用する。これにより、ボックスブラーに見られる均一で少し不自然なぼかしとは異なり、ガウシアンブラーは中心の情報をある程度保ちつつ、周辺に向かって徐々に影響を弱めることで、より目に優しいぼかしを実現する。

「ガウシアン」という名前は、統計学で使われる「正規分布」または「ベルカーブ(鐘の形をした曲線)」に由来している。この正規分布の考え方が、ガウシアンブラーの核心をなす原理だ。画像をぼかす際、ある特定のピクセルに注目し、その周辺のピクセルの色を重み付けして平均を計算する。この重み付けは正規分布に従うため、注目しているピクセル自身の色は最も強く保持され、そこから遠ざかるにつれて周辺ピクセルの色の影響度(重み)が徐々に小さくなる。つまり、中心のピクセルが最も重要であり、遠くのピクセルほど影響を弱めるという考え方でぼかしを行う。これにより、元の画像の色情報や特徴を完全に失うことなく、滑らかで自然なぼかしが実現できる。これは人間の視覚が画像を認識するメカニズムにも近く、画像をより美しく見せる効果がある。この重み付けのパターンは、2次元のガウス関数という数学的な数式によって厳密に定義される。

ガウシアンブラーでは、ガウス関数という数式を用いて、各ピクセルに適用するぼかしの「重み」を計算する。この重みの集合は「カーネル」と呼ばれる小さな行列(表)として表現される。ガウス関数は G(x,y) = 1/(2πσ²) * e^(-(x²+y²)/(2σ²)) と表される。この数式が、ぼかしの強さや広がり方を数学的に定義している。この式の中にはいくつかの記号が登場するが、それぞれの記号がぼかしの特性を決定する上で重要な役割を果たしている。この関数は、画像の特定のピクセルを中心とした相対的な位置(x, y)と、ぼかしの度合いを制御する「シグマ(σ)」という値に基づいて、その位置における重みを計算する。

このガウス関数は、大きく二つの部分と一つの重要なパラメータから構成されている。一つ目は「正規化係数」と呼ばれる 1/(2πσ²) の部分だ。この係数の役割は、カーネル内のすべての重み(値)を合計したときに、その合計がほぼ1になるように調整することにある。合計が1になるように調整するのは、もし合計が1より小さいと、画像全体が暗くなってしまい、逆に1より大きいと画像全体が明るくなりすぎてしまうためだ。元の画像の色強度を保ちながらぼかしを適用するためには、カーネルの合計値が1になるようにする正規化の処理は欠かせない。二つ目は「指数減衰部」と呼ばれる e^(-(x²+y²)/(2σ²)) の部分だ。この部分は、注目しているピクセルからどれだけ離れた位置にあるピクセルの色が、中心のピクセルにどれくらい影響を与えるかを決定する。ガウス関数が正規分布に基づいているため、この関数は中心から遠ざかるほど値が小さくなる特性を持っている。つまり、中心のピクセルからの距離が離れるほど、その位置にあるピクセルの色に対する影響度が指数関数的に減少する。これにより、中心のピクセル色は強く保持され、周囲のピクセルはその影響を緩やかに受けることになり、自然で滑らかなぼかしが生まれる。この指数減衰こそが、ガウシアンブラーの滑らかなぼかし効果を生み出す鍵である。そして、非常に重要なパラメータが「シグマ(σ)」だ。このシグマは、ぼかしの強さとその広がり方を決定する。シグマの値が大きいほど、ぼかしが強くなり、より広範囲のピクセルがぼかしの影響を受けることになる。これは、カーネルのサイズが大きくなることにもつながる。逆にシグマの値が小さいと、ぼかしは弱く、狭い範囲に限定される。シグマは、どのようなぼかし効果を得たいかに応じて調整する重要な要素である。

ガウシアンブラーを画像に適用するためには、まず「カーネル」と呼ばれる重み付けの行列を作成する必要がある。このカーネルは、ぼかしの計算に使用される各ピクセルの相対的な影響度を数値で表したものだ。最初に、シグマ(σ)の値を決定する。例えば、シグマを3と設定する。次に、カーネルのサイズ、つまり行列の縦横の大きさを決める。一般的には、シグマの値に基づいて適切なカーネルサイズを自動的に算出する数式もあるが、ここでは具体的な例として5x5のカーネルサイズを設定する。5x5のカーネルを作成する場合、この2次元配列の中心が最も高い重みを持つように設定する必要がある。プログラミングでは配列のインデックスは通常0から始まるため、配列の中心は(2,2)となるが、ガウス関数の計算では中心を(0,0)として扱うため、配列のインデックス(0,0)を(-2,-2)に対応させるなど、座標変換の工夫が必要になる。

具体的な計算例として、シグマを3、中心を相対座標(0,0)としたガウス関数で計算すると、正規化係数部から約0.017683、指数減衰部から1が得られ、積は約0.01768となる。次に、左上の端のピクセル、つまり相対座標(-2,-2)の場合を計算すると、正規化係数部から約0.017683、指数減衰部から約0.68が得られ、積は約0.01134となる。このように、中心から離れるほど計算結果(重み)が小さくなることがわかる。この計算を5x5カーネルのすべての位置に対して行い、得られた値を格納すると、中心が最も大きく、外側に向かって値が小さくなるような行列が完成する。これがガウスカーネルと呼ばれるものだ。このカーネルの各値が、ぼかしを適用する際の周辺ピクセルへの重み付けを表している。

カーネルが生成された後、重要なステップが「正規化」だ。生成されたカーネルのすべての値を合計したとき、その合計がほぼ1になっている必要がある。もし合計値が1でない場合、そのカーネルを画像に適用すると、画像全体が暗くなったり(合計が1未満の場合)、明るくなったり(合計が1より大きい場合)してしまい、元の画像の色情報が正しく保持されない。例えば、先ほどの5x5カーネルの計算結果の合計が約0.3465だったとすると、このカーネルで画像を処理すると、ぼかされた画像は元の明るさの約30%程度になってしまう。このような「非正規化」された状況では、カーネルを「再正規化」する必要がある。再正規化の方法はシンプルで、まず生成されたカーネル内のすべての値を合計する。次に、カーネル内のそれぞれの値を、その合計値で割る。こうして得られた新しい値を元のカーネルの各要素に置き換えるのだ。例えば、中心の0.01768という値は、合計値0.3465で割ると約0.0510となる。この作業をカーネルのすべての要素に対して行うことで、すべての要素を合計したときに、合計値がほぼ1になるカーネルを生成できる。厳密には、浮動小数点数の計算誤差によりぴったり1にならないこともあるが、0.999999のような1に近い値であれば実用上問題はない。この再正規化のステップは、ガウシアンブラーで自然なぼかし効果を得るために非常に重要だ。

カーネルが生成され、正規化されたら、いよいよそのカーネルを画像に適用して実際にぼかし効果を作り出す段階に入る。これは「畳み込み(Convolution)」と呼ばれる画像処理の一般的な手法だ。まず、元の画像と同じ幅と高さを持つ、新しい空白の画像を準備する。この新しい画像が、ぼかしが適用された結果の画像を格納する場所となる。次に、元の画像のすべてのピクセルに対してループ処理を行う。具体的には、元の画像の左上から右下まで、一つ一つのピクセルを順に見ていく。ある特定のピクセルに到達したら、そのピクセルを中心として、生成したカーネルを重ね合わせるように配置する。例えば、5x5のカーネルなら、そのピクセルを中心に5x5の範囲の周辺ピクセルを考慮する。このカーネルが重なった範囲の各ピクセルについて、カーネルのそれぞれの重みと、それに位置する元の画像のピクセルの色(明るさ)の値を掛け合わせる。そして、この掛け合わせた結果をすべて合計する。この合計値が、新しい画像の、現在処理しているピクセルに対応する位置の色(明るさ)となる。このプロセスを元の画像のすべてのピクセルに対して繰り返すことで、新しい画像が徐々に埋まっていき、最終的にぼかしが適用された画像が完成する。

ここで注意が必要なのが、画像の「端(エッジ)」の処理だ。例えば、左上の(0,0)ピクセルに5x5のカーネルを適用しようとすると、カーネルが画像の範囲を超えてはみ出してしまう部分が出てくる。具体的には、-1や-2といった負のインデックスのピクセルを参照しようとすることになる。このような画像範囲外のピクセルをどのように扱うかは、画像処理における一般的な課題だ。解決策の一つとして、「ゼロパディング」という方法がある。これは最も簡単な方法で、画像の範囲外のピクセルはすべて色が0(真っ黒)であると仮定して計算を行う。他にも、画像の端のピクセルを繰り返したり、ミラーリングしたりする方法など、いくつかの選択肢がある。どの方法を選ぶかによって、画像の端のぼかしの見た目がわずかに異なることがあるが、ゼロパディングは実装が容易であるためよく使われる。このようなエッジケースへの対応も、システムエンジニアとして画像処理プログラムを開発する際には考慮すべき重要な点だ。

関連コンテンツ