« PS3 Linux のキャプチャ | メイン | イヤホン »

Non Local Means

 4月はずっと、最近流行の AviUtl プラグインのNL-Means filter に触発されてノイズ除去のアルゴリズムである Non Local Means をいじくってた。
 NL-Means は広域で平均を取って絵をべた塗りに近づけるため、AviUtl 界ではアニメによく効くと言われている様子。

 これは畳み込みの一種であり、例えばよく使われている移動平均なんかは次のような感じで畳み込み

元画像 移動平均
1.01.01.0
1.01.01.0
1.01.01.0
元画像と移動平均

ガウスぼかしは次のようなので畳み込む。

移動平均
0.370.60.37
0.61.00.6
0.370.60.37
ガウスぼかし

 Non Local Means は畳み込む画素の周囲でマッチングを行って、その一致率でウエイトを作る。似通った領域では広く平均が取られ、似通っていない領域では平均されない。
 一致率の出し方が工夫のしどころではあるけど、NL-Means filter では差の二乗和を d、係数を h とすると

exp(-d*h)

というように指数に入れている。差が無ければウエイトが 1 になり、差が少しでも大きくなるとすぐ 0 に落ち込む。
 また、h が 0 であれば移動平均になり、h が大きくなるにつれ似通った領域のみ使われるようになる。最終的に h が無限大になれば元の画像に一致する。


h が小さい場合

h が大きい場合

 なんにせよ、パターンの一致率でウエイトを決めるため
0.10.20.5
0.81.00.1
0.20.60.4
とかいう感じで、全く対称性の無いウエイトが出来上がる。

 この手法の特徴は、パターンが一致している部分のみを使うので、エッジが完全に保存される。メディアンフィルタでは落ちてしまうような一本の線でさえも保存される。
 しかし、逆に一点のノイズであっても保存されてしまうので、結局強いノイズは予め他の手法で取り除いておかないといけない。


メディアンフィルタ
移動平均に比べてエッジが保存されている

 Non Local Means のみで強いノイズを除去するには h の値を小さくしないといけないが、それだと移動平均に近づくのでボケる。
 h を小さくしつつボケにくくする為には、畳み込みのサイズを小さくするしか無い。それでは広く平均を取れるこの手法の利点が薄くなる。

 そこで折衷案として、h を 0 にした時にガウスぼかしになるようにしてみた。
 こうすると領域は円形になるし、サイズを小数単位で微調整出来る。何より遠くにいく程弱くなるので、広過ぎる範囲で平均されない。


ガウスぼかしに近づく方法で h を小さくした場合

 うーん。SAMSUNG の文字は多少読みやすくなってるけど、あまり差が無いかな。

トラックバック

このエントリーのトラックバックURL:
http://yoffy.dyndns.org/cgi-bin/mt/mt-tb.cgi/582

コメントを投稿

About

2008年05月04日 15:53に投稿されたエントリーのページです。

ひとつ前の投稿は「PS3 Linux のキャプチャ」です。

次の投稿は「イヤホン」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.37