空間フィルタリング — カーネル畳み込みが画像を作り変える

「まわりの画素との重み付き和をとる」— たったそれだけの操作が、ぼかし・シャープ化・エンボスまで生み出します。画像処理の主役畳み込み(コンボリューション)を、カーネルが画像の上を滑る様子から1画素ずつ分解して理解します。

1. 畳み込みという操作 — 1画素ずつ分解して見る

空間フィルタリングでは、小さな数の表 — カーネル(フィルタ係数、3×3 が定番)— を画像に重ね、「重なった画素 × 係数」の総和を出力画素の値にします。カーネルを1画素ずつずらしながら全画素で繰り返すと、出力画像が完成します。

下のマシンで「1画素ステップ」を押しながら中央の Σ の中身を確認してください。カーネルを切り替えると、まったく同じ手順なのに結果の画像が別物になります。

カーネル畳み込みマシン — 積和が出力を1画素ずつ埋める
左=入力の16×16画像(家)、中央=いま重なっているカーネルと画素値、右=計算済みの出力。窓が画像からはみ出す境界では「端の画素を複製」して計算しています(→ 4章)。シャープ化では Σ が 0〜255 を超えることがあり、そのときはクランプ(切り詰め)されます。
g(x, y) = Σi Σj k(i, j) · f(x+i, y+j) (i, j = −1, 0, 1) 3×3 の場合。厳密な「畳み込み」はカーネルを180°回転してから重ねる定義だが、平均・ガウスのような対称カーネルでは回転してもしなくても同じ(回転なし版は「相関」と呼ばれる)
POINT — カーネルの合計が明るさを決める 係数の合計が 1 なら、平坦な領域は値が変わらない=画像全体の明るさが保存される。平均(1/9 × 9個)もガウス(合計 16/16)もシャープ化(5−4=1)も合計は1。合計が1からずれたカーネルは、画像全体を明るく/暗くしてしまう。

2. カーネルエディタ — 9個の数字がフィルタの個性

今度は自分でカーネルを設計してみましょう。マスを上下にドラッグして係数を変えると、64×64 のテスト画像への適用結果が即座に更新されます。プリセットを押して、それぞれのカーネルの「形」を観察してください。

カーネルエディタ — マスをドラッグして自作フィルタ
カーネルの各マスを上下にドラッグすると 0.05 刻みで係数が変わります(青=正、赤=負)。中心だけ大きくすると恒等に近づき、周囲に負を配ると輪郭が強調される — 「合計」の表示と画像の明るさの関係も確かめてください。
注意 — 負の値とクランプ 画面表示は 0〜255 にクランプしている。輪郭・エンボスのような微分系カーネルの出力は本来符号つき(負の値に意味がある)なので、実際の処理では符号つきのまま持ち回るか、可視化のときだけ +128 のオフセットを加えるのが定石。

3. ガウシアンぼかしと σ — 「ぼかしの強さ」の正体

ぼかしの決定版がガウシアンフィルタです。ボックス平均は全員同じ重みなので、ぼかした縁に不自然な帯が出がち。ガウスは中心ほど重く、離れるほど滑らかに軽く、しかも回転対称なので方向のクセがありません。

強さを決めるパラメータがただ1つ、標準偏差 σ。σ を大きくすると山が低く広くなり、遠くの画素まで混ざる=強くぼける。重みは 3σ より外ではほぼ 0 になるので、カーネル半径は 3σ 程度で打ち切ります。

σ スライダー — カーネルの山とぼかし量が連動する
左=2次元ガウスの山(断面を並べた3D風表示)、中央=離散化した数値グリッド(σ が小さいときは重み×1000 の数値つき)、右=64×64画像への適用結果。比較モードでは「同じ σ で2回ぼかす」と「√2 倍の σ で1回ぼかす」の最大画素差が表示されます — ほぼゼロです。
G(x, y) = (1 / 2πσ²) · e−(x² + y²) / 2σ² 2次元ガウス関数。体積(重みの合計)が1になるよう正規化されている
POINT — σ の加法的性質(2回ぼかす=大きく1回) ガウスぼかしを σ₁ → σ₂ と続けて適用した結果は、σ = √(σ₁² + σ₂²) の1回のガウスぼかしと厳密に一致する(ガウス関数どうしの畳み込みはガウスになる)。σ が「二乗の足し算」で合成されるこの性質は、画像ピラミッドや DoG(ガウス差分)など多くのアルゴリズムの土台。

4. 境界はどう扱う? — 画像の外側問題

カーネルの窓が画像の端に来ると、窓の一部が画像の外にはみ出します。外側の値をどう仮定するかで、縁の仕上がりが変わります。

方式外側の値特徴
ゼロ埋め(zero)0 とみなす実装が最も簡単。ただし縁が不自然に暗くなる
複製(replicate)端の画素を延長自然で無難。このページのデモもこれ
鏡映(reflect)端で折り返す縁付近の明るさの統計が保たれ、品質が良い
循環(wrap)反対側の端から続ける画像を周期信号とみなす。FFT ベースの畳み込みと整合

5. 分離可能フィルタ — 同じ結果を桁違いに速く

ガウスには計算上の大きな贈り物があります。指数法則から e−(x²+y²)/2σ² = e−x²/2σ² · e−y²/2σ²、つまり G(x, y) = g(x) · g(y) と縦横の1次元関数の積に分離できるのです(3章の山の断面がどれも同じ釣鐘型だった理由)。すると「横方向に1次元ぼかし → その結果を縦方向に1次元ぼかし」の2パスで、2次元の畳み込みと完全に同じ結果が得られます。

K×K カーネル:画素あたり K² 回の積和 → 分離すれば 縦K + 横K = 2K 回 15×15 のガウスなら 225 回 → 30 回。7.5 倍の高速化。K が大きいほど差は開く
一歩先へ — 高速化はここまでできる ボックス平均は「移動平均」や積分画像を使えばカーネルサイズに関係なく画素あたり O(1) で計算できる。さらに「ボックスを3回重ねるとほぼガウスになる」(中心極限定理)ことを利用した近似ガウスは、リアルタイム処理や GPU シェーダの定番テクニック。一方シャープ化のラプラシアン部分は分離不可能だが、係数が5個しかないのでそのままでも軽い。

6. まとめ