画像のノイズを消したいとき、いちばん素朴な方法は近所の画素を平均することだ。ガウスぼかしはその代表で、近い画素ほど大きな重みで足し合わせる。
ただし副作用がある。輪郭——明るさが急に変わる場所——も一緒に溶ける。ノイズと同じ「細かい変化」だから、区別せずに平均してしまうのだ。
問い: ノイズは消したい、エッジは残したい。両立できるか
バイラテラルフィルタの答えは、重みを二重にすることだった。
第一項はガウスぼかしと同じ「距離が近いほど仲間」。第二項が発明で、「明るさが近いほど仲間」を掛け算する。
エッジの向こう側の画素は、距離では近くても明るさが大きく違う。だから第二項がほぼゼロになり、平均に参加できない。結果として、平均は「エッジのこちら側の、自分と似た明るさの画素」だけで行われる。面の中のノイズは消え、面と面の境界は残る。
崖の比喩
grayscaleの画像を標高だと思うと分かりやすい。ガウスぼかしは地形全体に雨を降らせてなだらかにする——崖も丸くなる。バイラテラルは「自分と同じ高さの土地だけを均す」ので、台地は台地のまま、上面だけが平らになる。
代償はある
- 計算量。重みが画素値に依存するので、畳み込みのような分離・高速化が素直には効かない(近似手法が色々ある)。
- σ_r を大きくしすぎるとただのガウスぼかしに退化し、小さくしすぎると何も起きない。「どのくらいの明るさ差からが『別の面』か」を自分で決める必要がある。
- 強くかけると絵画調の「のっぺり」が出る。スマホの美肌処理の質感は、だいたいこれの親戚だ。
ノイズ除去とエッジ保存は原理的にトレードオフに見えるが、「似た者同士だけで平均する」という一つの工夫でかなりの範囲まで両立する。フィルタの重みに画像自身を参照させる——この自己参照の一歩が、単純な線形フィルタとの分水嶺になっている。