ノイズと画像復元 — 汚れた画像をどう救うか
撮影した画像には必ずノイズが混入します。大事なのは、ノイズの「性格」を見極めて、それに合った武器(フィルタ)を選ぶこと。ごま塩ノイズにはメディアンフィルタが圧勝する理由を、数値(PSNR)と見た目の両方で確かめます。
1. ノイズはどこから来るか — 2つの代表選手
観測される画像 g は、本来の画像 f にノイズ n が加わったものとしてモデル化できます。
g(x, y) = f(x, y) + n(x, y)
g: 観測画像、f: 本来の画像、n: ノイズ。「復元」とは g から f を推定すること
ノイズの代表は次の2種類で、性格がまったく違います。
- ガウスノイズ — センサの熱雑音など。全画素が正規分布に従って少しずつ揺らぐ。
- ごま塩ノイズ(インパルスノイズ) — 通信エラーや欠陥画素など。ごく一部の画素だけが 0(黒)か 255(白)に吹き飛ぶ。
下のデモで2つを切り替えて、画像とヒストグラムがどう変わるかを見比べてください。
ノイズ図鑑 — ガウス vs ごま塩
スライダーを動かすと対応するノイズに自動で切り替わります。ヒストグラムに注目 — ガウスノイズは原画像の鋭い山をにじませて太らせ、ごま塩ノイズは山はそのままに両端(0と255)に棘を立てます。
POINT — ヒストグラムはノイズの指紋
ガウスノイズは「全員が少し狂う」ので分布全体がぼやける。ごま塩は「少数が大きく狂う」ので分布の本体は無傷のまま両端にスパイクが立つ。この性格の違いが、後で「効くフィルタ」の違いに直結する。
2. 復元の腕くらべ — PSNR という物差し
フィルタでノイズを消したとき、「どれくらい元に戻せたか」を測る定番の指標が PSNR(ピーク信号対雑音比)です。原画像との平均二乗誤差 MSE が小さいほど PSNR は大きくなります。目安として、30 dB を超えるとかなりきれい、20 dB 以下は明らかに劣化が見える水準です。
MSE = 平均[ (f − g)² ], PSNR = 10 log10( 255² / MSE ) [dB]
255 は 8bit 画像の最大輝度。誤差ゼロなら PSNR は無限大
挑戦者は3人。窓内の9画素を単純平均する平均フィルタ、中心ほど重くなめらかに混ぜるガウシアンフィルタ、そして窓内の値を並べ替えて真ん中を選ぶメディアンフィルタ。ノイズ×フィルタの全組合せを試してみましょう。
フィルタ対決 — ノイズ別・PSNR で勝敗をつける
右下の枠は屋根のエッジ部分の拡大。ごま塩×平均では白黒の点が灰色のシミに広がって残るのに対し、ごま塩×メディアンでは点が消えた上にエッジの鋭さも保たれ、PSNR も最高になります。
注意 — 線形フィルタの限界
平均もガウシアンも「窓の中の全員の意見を混ぜる」線形フィルタ。0 や 255 という極端な外れ値も律儀に計算へ混ぜてしまうため、ごま塩ノイズは消えずに「薄まって広がる」。外れ値に強い処理には非線形の発想が必要になる。
3. メディアンフィルタ — 「並べて真ん中」の魔法
メディアンフィルタは、3×3 窓の9画素を小さい順に並べ替え、5番目(中央値)を出力するだけの処理です。0 や 255 の外れ値はソートで必ず端に追いやられるため、中央値には決して選ばれません。1画素ずつの動きをアニメーションで追ってみましょう。
メディアンフィルタの動作 — 外れ値が捨てられる瞬間
左=入力(左右2つの明るさ領域+外れ値)、中央=窓内9画素のソート、右=出力。窓に 0 や 255 が入った瞬間、それらがソート列の端(赤枠)に並び、緑枠の中央値には選ばれない様子に注目。左右の境界(エッジ)も崩れません。
POINT — なぜエッジが保たれるのか
平均フィルタは境界の上で「明るい側と暗い側の中間の値」を捏造してしまう。一方メディアンは窓の中に実在する画素値しか出力しない。境界上では窓内の多数派(5画素以上を占める側)の値が選ばれるので、境界は中間色でにじまず、段差のまま保たれる。
4. エッジを守る平滑化 — バイラテラルフィルタ
「なめらかにしたい、でもエッジは崩したくない」をもう一歩進めたのがバイラテラルフィルタです。ガウシアンの空間的な重みに、輝度が近い画素だけを仲間とみなす第2の重みを掛け合わせます。
w(p, q) = exp( −‖p−q‖² / 2σs² ) · exp( −(Ip−Iq)² / 2σr² )
第1項=空間距離の近さ、第2項=輝度の近さ。σr(σ_color)が輝度差の許容幅
エッジの向こう側の画素は「輝度が遠い」ので重みがほぼゼロになり、平均がエッジをまたがない — これがエッジ保存平滑化の直感です。
バイラテラルフィルタの直感 — 2重の重みがエッジで止まる
上=ノイズ入りの段差信号と2つの平滑化結果。下=注目画素の平均に使われる重み。注目点を段差の近くに置くと、バイラテラルの重み(棒)が段差の向こう側でストンとゼロになるのが見えます。σ_color を大きくしていくと輝度の選別が効かなくなり、ただのガウシアン(エッジがなまる)に近づきます。
5. まとめ — ノイズと武器の対応表
- ガウスノイズ=全画素の小さな揺らぎ。平均・ガウシアンなどの線形フィルタが順当に効く。
- ごま塩ノイズ=少数画素の極端な外れ値。線形フィルタでは薄まって広がるだけ。メディアンが外れ値だけを捨て、エッジも保つ。
- PSNR=復元品質の物差し。MSE が小さいほど高い(30 dB 超でかなり良好)。
- バイラテラル=空間の近さ×輝度の近さの2重重みで、エッジをまたがずに平滑化する。
一歩先へ — 現代のデノイズ
「似たパッチは画像内に何度も現れる」ことを使う Non-local Means や BM3D が古典手法の到達点。現在は DnCNN などの畳み込みネットワーク、さらには拡散モデル(ノイズ除去そのものを生成の原理にした手法)が主役になりつつある。それでも「ノイズの性格を知り、エッジを守る」という本章の考え方は、すべての土台であり続けている。