空間フィルタリング — カーネル畳み込みが画像を作り変える
「まわりの画素との重み付き和をとる」— たったそれだけの操作が、ぼかし・シャープ化・エンボスまで生み出します。画像処理の主役畳み込み(コンボリューション)を、カーネルが画像の上を滑る様子から1画素ずつ分解して理解します。
1. 畳み込みという操作 — 1画素ずつ分解して見る
空間フィルタリングでは、小さな数の表 — カーネル(フィルタ係数、3×3 が定番)— を画像に重ね、「重なった画素 × 係数」の総和を出力画素の値にします。カーネルを1画素ずつずらしながら全画素で繰り返すと、出力画像が完成します。
下のマシンで「1画素ステップ」を押しながら中央の Σ の中身を確認してください。カーネルを切り替えると、まったく同じ手順なのに結果の画像が別物になります。
2. カーネルエディタ — 9個の数字がフィルタの個性
今度は自分でカーネルを設計してみましょう。マスを上下にドラッグして係数を変えると、64×64 のテスト画像への適用結果が即座に更新されます。プリセットを押して、それぞれのカーネルの「形」を観察してください。
- ぼかし:全マス 1/9。周囲と混ぜる=高周波(細かい模様)を消す。市松模様の領域が灰色に溶けるのに注目。
- シャープ化:中心 5、上下左右 −1。「恒等 +(恒等 − ぼかし)」の形で、元画像に輪郭成分を足し込む操作。
- エンボス:斜め方向の微分+中心 1。輝度の変化が「浮き彫り」の陰影になる。
- 輪郭(ラプラシアン):合計 0。平坦部は 0(黒)になり、輝度が変化する場所だけが光る。
3. ガウシアンぼかしと σ — 「ぼかしの強さ」の正体
ぼかしの決定版がガウシアンフィルタです。ボックス平均は全員同じ重みなので、ぼかした縁に不自然な帯が出がち。ガウスは中心ほど重く、離れるほど滑らかに軽く、しかも回転対称なので方向のクセがありません。
強さを決めるパラメータがただ1つ、標準偏差 σ。σ を大きくすると山が低く広くなり、遠くの画素まで混ざる=強くぼける。重みは 3σ より外ではほぼ 0 になるので、カーネル半径は 3σ 程度で打ち切ります。
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次元の畳み込みと完全に同じ結果が得られます。
6. まとめ
- 空間フィルタ=カーネルとの畳み込み。9個(K²個)の係数がフィルタの個性のすべて。
- 合計1のカーネルは明るさを保存(ぼかし・シャープ系)、合計0は変化だけを取り出す(微分・輪郭系)。
- ガウシアンぼかしは σ 1つで強さが決まり、繰り返し適用は σ の二乗和で合成される。
- 実装では境界処理の選択と分離可能性(2パス化)が品質と速度を左右する。