はじめに
OpenCVをはじめ、様々な画像処理の中で、思うように画像が処理されない場合、ノイズ除去やフィルタをかけることがあると思います。フィルタには様々な種類がありますが、ノイズを除去したい場合、とりあえずガウシアンフィルタをかけましょう!は間違いです。
もちろんガウシアンフィルタは、ノイズに対して有効な手段の1つではありますし、様々な処理で利用されている有名なノイズ除去法です。しかし、一言でノイズ除去といっても、ノイズ以外の要素がどのように変化するかによって、その後の処理の精度も変わってきます。各フィルタの特徴を押さえておくことで、より高精度な画像処理が出来ます。
ガウシアンフィルタって何者?
ガウシアンフィルタは、画像処理において用いられるフィルタの一つで、画像を滑らかにするために使用されます。このフィルタは、画像内の細かいノイズやテクスチャを平滑化し、全体的になめらかな画像を生成します。
細かい仕組みは割愛しますが、一言で言うと、「ある画素に着目し、その画素からの距離に応じて重みの異なる平滑化処理を行う」というものです。着目した画素と距離が近ければ強いフィルタがかかり、遠ざかるにつれて緩いフィルタがかかるということです。
これを画像内のすべての画素に対して行うため、ノイズの部分に着目した場合、周囲と画素値が大きく異なるため、周りの正常な画素の画素値に近づくように補正(平滑化)されます。ノイズの周辺すべてのフィルタリングが完了したとき、ノイズが低減されている、という仕組みです。
このフィルタは、ガウス分布関数(正規分布関数)を基にしているため、ガウシアンフィルタと呼ばれています。
なぜ、ガウシアンフィルタだけではダメなのか?
結論から言うと、エッジがボケてしまうことです。
エッジは、隣合う画素との輝度値の差が大きい領域のことを指します。
ガウス分布関数で考えると、中心からの距離しか考慮されてません。
輝度値の差はまったく考慮されていないので、輝度値の差が大きいエッジの部分も同じように平滑化されてしまい、ボケてしまいます。
白い紙に左右を両断する黒い線があったとき、線の部分と線でない部分は画素値が大きく異なり、これにガウシアンフィルタをかけると、黒い線は背景の白に、背景の白は黒い線に、緩やかに寄ってくため、線がぼやけてしまいます。
ほかのノイズ除去のフィルタについて
メディアンフィルタ
このフィルタは平均化ではなく中央値を取るというものです。平均化せずに、着目した画素の周囲の画素の中央値を取るので、エッジがぼやけることがありません。エッジを残したい場合はこちらのフィルタを使うとより鮮明になります。
メディアンフィルタを使うデメリットとしては、エッジ以外の部分(特に細かい柄や薄い模様など)が全体的にぼやーっとしてしまうことで、元画像の情報が失われる可能性があります。
バイラテラルフィルタ
バイラテラルフィルタは、ガウシアンフィルタに輝度値の差を考慮に入れたフィルタです。
先程のガウシアンフィルタの説明で、輝度値の差を考慮していないため、エッジがぼやける、という話がありましたが、そのデメリットを解消するとても優秀なフィルタです。
と、言いたいところですが、このフィルタはとても処理に時間がかかります。
仕組みとしてはガウシアンフィルタのガウス分布関数の次元を1つ増やして、元軸にカーネル中心からの距離を横軸にしたときの正規分布(ガウシアンフィルタ)を、新規の軸に輝度値の差の正規分布を配置します。新規の軸は元軸とは対称的に、輝度値の差が大きいほど重みを小さくします。これにより、エッジを残したままノイズを除去することが出来ます。単純計算で1乗分増えるわけなので、処理時間がかなり遅いです。
高精度ですが、リアルタイム処理や、速度重視のシステムには使えない、といったところです。
ノイズ除去手法のメリットデメリットを一覧化してみる
フィルタ | メリット | デメリット |
---|---|---|
ガウシアンフィルタ | 処理速度が若干速い | エッジがぼやける |
メディアンフィルタ | エッジをくっきり残せる | エッジ以外がぼやける |
バイラテラルフィルタ | エッジも残せて全体的にも綺麗 | 処理時間が長すぎる |
以上のことから、ガウシアンフィルタは、処理が早い分、リアルタイム処理に使えますが、フィルタリングした画像を出力するのであれば、ぼやぼやの画像になってしまいます。なので使いどころとしては、比較処理の前処理として用いるのは有効だと思います。
とにかくエッジをくっきり残しながら手早くノイズを除去したい場合は、メディアンフィルタを、
時間がかかってもよいのでとにかく元画像の情報を損なわないようにするのであればバイラテラルフィルタが有効です。
おわり
ノイズ除去をする際は、どのような処理に取り入れるのかをよく考えてフィルタを選択することで、より高精度なフィルタリングが出来ます。