PythonとOpenCVを使って画像ノイズ除去を実装する方法

スポンサーリンク

この記事では、プログラミング言語としてPythonを利用し、機械学習アルゴリズムを用いてノイズの多い画像をノイズ除去する方法を紹介します。

それでは、画像ノイズ除去とは何か、そしてどのようにそれを実装するかについて、これからのセクションで説明していきます。

こちらもご覧ください。

画像ノイズ除去入門

デジタル写真の爆発的な普及に伴い、より精密で美しい写真への要求が高まっています。

一方、最近のカメラでは、ノイズに汚染された画像が生成され、視覚的な品質が低下しています。

そのため、画質(エッジやコーナーなどのシャープな構造)を犠牲にすることなく、ノイズを最小限に抑えることが求められています。

1
2
3
4
import cv2
import numpy as np
from matplotlib import pyplot as plt
plt.style.use('seaborn')

画像ノイズ除去とは、ノイズの多い画像からノイズを除去し、元の画像を復元することです。

しかし、ノイズやエッジ、テクスチャなど、ノイズ除去の過程で区別がつきにくい成分があるため、ノイズ除去後の画像は、どうしても特徴が失われてしまうことがあります。

そのため、ノイズの多い画像から有用な情報を復元し、高品質な写真に仕上げることが近年重要な課題となっています。

スポンサーリンク

Pythonによる画像ノイズ除去 – 実装

画像ノイズ除去の入門編を終えたところで、次は実装編に移ります。

1. モジュールのインポート

image = cv2.imread('sample_denoise_input.jpg')

2. イメージのロード

プログラム中に画像を読み込むために、imread関数を使用します。

そのためのコードを以下に示す。

dst = cv2.fastNlMeansDenoisingColored(image, None, 11, 6, 7, 21)

3. OpenCVのノイズ除去関数の適用

OpenCVライブラリには,以下のような複数のノイズ除去関数が用意されています.

S.no. 関数名|説明|1
1 cv2.fastNlMeansDenoising() 1つのグレースケール画像に対して動作します.
2 cv2.fastNlMeansDenoisingColored() カラー画像に対して有効.
3 cv2.fastNlMeansDenoisingMulti() 複数のグレイスケール画像に対して有効.
4 cv2.fastNlMeansDenoisingColoredMulti() 一連のカラー画像に対して動作します.

ノイズ除去のテクニック – OpenCVこの記事では,1つのカラー画像を読み込むので,2番目の関数を利用します.そのためのコードを以下に示します。

1
2
3
4
5
6
7
8
row, col = 1, 2
fig, axs = plt.subplots(row, col, figsize=(15, 10))
fig.tight_layout()
axs[0].imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
axs[0].set_title('Elephant')
axs[1].imshow(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB))
axs[1].set_title('Fast Means Denoising')
plt.show()

4. オリジナル画像とノイズ除去画像のプロット

画像のノイズ除去が完了したので、次に subplots を用いてオリジナルとノイズ除去された画像をプロットします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import cv2
import numpy as np
from matplotlib import pyplot as plt
plt.style.use('seaborn')
 
image = cv2.imread('sample_denoise_input.jpg')
dst = cv2.fastNlMeansDenoisingColored(image, None, 11, 6, 7, 21)
 
row, col = 1, 2
fig, axs = plt.subplots(row, col, figsize=(15, 10))
fig.tight_layout()
axs[0].imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
axs[0].set_title('Elephant')
axs[1].imshow(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB))
axs[1].set_title('Fast Means Denoising')
plt.show()

Complete Code for Denoising Images

Image Denoise Sample

サンプル出力

では、先ほどのコードの出力例を見てみましょう。

Final Output Denoising Image
Final Output 2 Denoising Image
Final Output 3 Denoising Image

まとめ

コンセプトを理解し、出力を気に入っていただけたでしょうか?もっと多くの画像で同じことを試して、画面上で起こるマジックを見てみましょう。

それでは、Happy Coding!

もっと学びたいですか?以下のチュートリアルをご覧ください。

  1. PythonとOpenCV:画像にフィルタを適用する
  2. PythonでORB特徴検出
  3. Pythonによる色検出 – 初級リファレンス
タイトルとURLをコピーしました