読み込み中...

Pythonでノイズ除去!初心者でも理解できる5つのステップ

Pythonを使ったノイズ除去のステップバイステップガイド Python
この記事は約8分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Pythonを使ったノイズ除去の方法を学びたいですか?あなたが初心者でも安心してください。

この記事では、ノイズ除去を行うための5つのステップを紹介します。

ノイズ除去の技術は画像処理だけでなく、音声やビデオなど、あらゆるデジタルデータのクリーニングに活用することができます。

●Pythonとは?

Pythonは、初心者から専門家までが利用できる非常に強力なプログラミング言語です。

そのシンプルで読みやすい構文は、プログラミングの学習を容易にします。

また、Pythonは画像処理やデータ解析など、さまざまな目的で使うことができるため、その用途は広範にわたります。

●ノイズ除去とは?

ノイズとは、デジタルデータに存在する不要なランダムな変動のことを指します。

これは、画像や音声、ビデオなどのデータにおいて、元の情報を歪める可能性があります。

そのため、ノイズを除去することで、データの品質を向上させることが可能になります。

●Pythonでのノイズ除去の方法

次に、Pythonでノイズ除去を行うための具体的な手法を5つのステップで見ていきましょう。

○ライブラリのインストール

Pythonでノイズ除去を行うためには、まず必要なライブラリをインストールする必要があります。

ここでは、OpenCVとNumPyという二つのライブラリを使用します。

これらは、次のようにpipコマンドを使ってインストールすることができます。

pip install opencv-python
pip install numpy

このコードでは、pipというPythonのパッケージマネージャを使ってOpenCVとNumPyをインストールしています。

OpenCVは画像処理に特化したライブラリで、NumPyは数値計算を効率的に行うライブラリです。

○画像の読み込み

次に、ノイズ除去を行う対象の画像を読み込みます。

これは、OpenCVのimread関数を使用することで行うことができます。

import cv2

image = cv2.imread('input.jpg', 0)

このコードでは、cv2.imread関数を使って’input.jpg’というファイル名の画像を読み込んでいます。

この例では、0を第二引数として指定しているため、画像はグレースケールとして読み込まれます。

○ノイズ除去の手法とそのコード例

ノイズ除去には様々な手法がありますが、ここでは中央値フィルター法、ガウシアンフィルター法、Non-local Means法の3つを紹介します。

□中央値フィルター法

中央値フィルターは、画像の各ピクセルをその周囲のピクセルの中央値に置き換えることでノイズを除去します。

median_filtered = cv2.medianBlur(image, 5)

このコードでは、cv2.medianBlur関数を使ってノイズ除去を行っています。

この例では、5を引数として指定しているため、5×5の範囲で中央値フィルターが適用されます。

□ガウシアンフィルター法

ガウシアンフィルターは、ガウス分布に基づいて画像の各ピクセルを平滑化し、ノイズを除去します。

gaussian_filtered = cv2.GaussianBlur(image, (5, 5), 0)

このコードでは、cv2.GaussianBlur関数を使ってガウシアンフィルターを適用しています。

この例では、(5, 5)を引数として指定しているため、5×5の範囲でガウシアンフィルターが適用されます。

また、最後の引数0は、ガウス分布の標準偏差を表します。これを0に設定することで、フィルターサイズから自動的に計算されます。

□Non-local Means法

Non-local Means法は、画像全体から類似するパッチを探し出し、その平均値でピクセルを置き換えることでノイズを除去します。

この手法は高品質な結果を出すことができますが、計算時間が長いという欠点があります。

non_local_means_filtered = cv2.fastNlMeansDenoising(image, None, 10, 7, 21)

このコードでは、cv2.fastNlMeansDenoising関数を使ってノイズ除去を行っています。

この例では、第三引数に10、第四引数に7、第五引数に21を指定しています。

これらはそれぞれフィルタの強さ、探索窓のサイズ、ブロックサイズを表しています。

○ノイズ除去の結果の表示

ノイズ除去の結果は、cv2.imshow関数を使用して画面に表示することができます。

下記のコードは、上記で得た3種類のノイズ除去画像を表示する例です。

cv2.imshow('Median Filter Processing', median_filtered)
cv2.imshow('Gaussian Filter Processing', gaussian_filtered)
cv2.imshow('Non-Local Means Processing', non_local_means_filtered)
cv2.waitKey(0)
cv2.destroyAllWindows()

このコードでは、cv2.imshow関数を用いて画像を表示しています。

表示するウィンドウのタイトルと表示する画像を引数として指定します。

cv2.waitKey(0)はキーボードの入力を待つための関数で、cv2.destroyAllWindows()はすべてのウィンドウを閉じるための関数です。

○結果の保存

処理結果をファイルとして保存したい場合は、cv2.imwrite関数を使います。

下記のコードは、上記で得た3種類のノイズ除去画像をそれぞれファイルとして保存する例です。

cv2.imwrite('median_output.jpg', median_filtered)
cv2.imwrite('gaussian_output.jpg', gaussian_filtered)
cv2.imwrite('nlmeans_output.jpg', non_local_means_filtered)

このコードでは、cv2.imwrite関数を使って画像を保存しています。

保存するファイル名と保存する画像を引数として指定します。

●Pythonによるノイズ除去の応用例

Pythonでのノイズ除去は、画像だけでなく動画や音声にも適用できます。

それでは、動画と音声からノイズを除去する方法を見ていきましょう。

○動画からのノイズ除去

動画からノイズを除去する場合、動画をフレームごとの画像に分解し、それぞれにノイズ除去を適用して再度結合します。

import cv2

cap = cv2.VideoCapture('input.mp4')

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.mp4', fourcc, 20.0, (640, 480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret == True:
        frame = cv2.medianBlur(frame, 5)
        out.write(frame)
    else:
        break

cap.release()
out.release()

このコードでは、cv2.VideoCapture関数を使って動画を読み込み、cv2.VideoWriter関数を使ってノイズ除去後の動画を書き出しています。

フレームごとにcv2.medianBlur関数を適用することで、動画全体からノイズを除去しています。

○音声からのノイズ除去

音声からノイズを除去するには、scipyという科学計算ライブラリとpydubという音声処理ライブラリを使用します。

from pydub import AudioSegment
import scipy.signal

audio = AudioSegment.from_file('input.wav', format='wav')
samples = audio.get_array_of_samples()

filtered_samples = scipy.signal.medfilt(samples, 5)

filtered_audio = audio._spawn(data=filtered_samples)

filtered_audio.export('output.wav', format='wav')

このコードでは、pydubのAudioSegment.from_file関数で音声を読み込み、scipy.signal.medfilt関数でノイズ除去を行っています。

最後に、AudioSegment.export関数でノイズ除去後の音声を保存しています。

●注意点と対処法

以上の方法でノイズ除去を行う際には、いくつか注意点があります。

  1. フィルタのサイズを大きくすると、ノイズ除去の効果は増すが、画像の詳細が失われる可能性があります。
    これは、フィルタが大きいほど、画像の各ピクセルが周囲のピクセルに影響を受けるためです。
  2. ノイズの種類によって最適なノイズ除去方法が異なります。
    例えば、ソルト・アンド・ペッパーノイズ(塩胡椒ノイズ)などは中央値フィルタが有効ですが、ガウシアンノイズなどはガウシアンフィルタやNon-local Means法が有効です。
    ノイズの種類によって適切なノイズ除去方法を選びましょう。
  3. ノイズ除去は情報の一部を失う処理です。
    そのため、ノイズ除去後に元の信号を完全に復元することは難しい場合が多いです。
    ノイズ除去の目的と結果のバランスを考えながら、適切なノイズ除去法を選択しましょう。

これらの注意点を念頭に置き、自身の目的に最適な方法を選び、適切なパラメータを選定することが大切です。

まとめ

以上、Pythonを用いたノイズ除去の基本的な手法について解説しました。

ライブラリのインストールから、画像の読み込み、ノイズ除去の実行、結果の表示と保存、さらには応用例と注意点まで、ノイズ除去に関する基本的な流れを学んでいただきました。

Pythonはその豊富なライブラリと簡潔な文法により、画像、動画、音声など、さまざまなデータのノイズ除去を効率よく行うことが可能です。

是非とも、この記事を参考にPythonを活用したノイズ除去にチャレンジしてみてください。