【OpenCV】fastNlMeansDenoising関数で画像のノイズ除去

【OpenCV】fastNlMeansDenoising関数で画像のノイズ除去 プログラミング

OpenCVと言えば、顔認識で有名ですよね。
ただ、OpenCVはそれだけではありません。

画像編集ライブラリとして、普通に使うことができます。
例えば、画像のノイズ除去をOpenCVで行えます。

本記事の内容

  • 画像のノイズ除去とは?
  • OpenCVにおける画像のノイズ除去
  • fastNlMeansDenoising関数による画像のノイズ除去
  • fastNlMeansDenoisingColored関数による画像のノイズ除去

それでは、上記に沿って解説していきます。

画像のノイズ除去とは?

ノイズとは、日本語では雑音です。
要するに、ノイズは不要なモノと言えます。

では、画像のノイズとは?
画像における不要なモノ(情報)と言うことができます。

具体的には、以下を画像のノイズと言います。
テレビの砂嵐は、立派なノイズです。

以上より、画像のノイズ除去とは、画像における不要な情報を取り除くことと言えます。
そして、ノイズ除去を行うことで、対象をキレイにしていきます。

この考え方は、画像でも音でも同じです。
とにかく、ノイズ除去で不要をモノを取り除くと覚えておきましょう。

OpenCVにおける画像のノイズ除去

OpenCVでは、ノイズ除去を行うための関数を4つ用意しています。

  • cv2.fastNlMeansDenoising()
  • cv2.fastNlMeansDenoisingColored()
  • cv2.fastNlMeansDenoisingMulti()
  • cv2.fastNlMeansDenoisingColoredMulti()

これらの関数は、扱う対象の形式・色で次のようにまとめることができます。
正確には、出力されるモノの形式・色と言った方がよいかもしれません。

関数形式
fastNlMeansDenoising画像グレースケール
fastNlMeansDenoisingColored画像カラー
fastNlMeansDenoisingMulti動画グレースケール
fastNlMeansDenoisingColoredMulti動画カラー

要するに、「画像か動画か?」、「グレースケールかカラーか?」というだけです。

関数仕様なんて見ても、そこからは得るものは多くありません。
関数なんて、実際に利用してナンボです。

ということで、関数を試していきましょう。

fastNlMeansDenoising関数による画像のノイズ除去

前提として、OpenCVが利用できるようにしておいてください。
OpenCVのインストールに関しては、次の記事が参考になります。

OpenCVが動く準備が整ったら、まずは画像を用意しましょう。
ノイズが多い写真であればあるほどよいです。

今回は、次の写真を用意しました。

それなりのノイズがあります。
では、この画像input.jpgとします。

このinput.jpgのノイズを除去しましょう。
そのサンプルコードは以下。

import cv2

INPUT_IMG = "input.jpg"

# オリジナル画像
src = cv2.imread(INPUT_IMG)
# ノイズ除去した画像
result = cv2.fastNlMeansDenoising(src, h=20)

# 画像保存
cv2.imwrite('output.png', result)

上記を実行すると、次の画像が作成されます。

ノイズが減ったのかどうか、イマイチわかりません。
並べてみましょう。

確かに、ざらざらした感じのモノはなくなりました。
あと、fastNlMeansDenoising関数はノイズ除去した画像をグレースケール化するのですね。

また、fastNlMeansDenoisingの引数hは、現状では以下の値です。

h=20

この引数hが、ノイズ除去の強弱を決定します。
その代わり、hを大きくし過ぎると除去すべきでないものまで除去してしまいます。

以上が、fastNlMeansDenoising関数による画像のノイズ除去の解説です。
折角なら、グレースケール化せずに画像を比較してみたいと思いませんか?

最後に、fastNlMeansDenoisingColored関数による画像のノイズ除去を行います。

fastNlMeansDenoisingColored関数による画像のノイズ除去

コードは以下。
fastNlMeansDenoisingをfastNlMeansDenoisingColoredに置き換えています。
あと、出力画像の名前を変更しています。

import cv2

INPUT_IMG = "input.jpg"

# オリジナル画像
src = cv2.imread(INPUT_IMG)
# ノイズ除去した画像
result = cv2.fastNlMeansDenoisingColored(src, h=20)

# 画像保存
cv2.imwrite('output_color.png', result)

上記を実行した結果は、以下となります。
オリジナルとノイズ除去後の画像を比較。

先ほどより、ノイズが除去された感は増しました。
結果の良しあしはあるでしょう。

しかし、これだけ簡単にノイズ除去ができるというのはスゴイことです。
まあ、ノイズがある方が味がある画像とは言えますけどね。

タイトルとURLをコピーしました