OpenCVのGaussianBlur関数を使った画像のスムージング

概要

この記事ではOpenCVで画像をぼかす機能について紹介します。OpenCVのGaussianBlur関数は、画像のスムージング(平滑化)を行っています。スムージングは、画像のノイズを減らし、画像の詳細をぼかすことで、画像解析や画像処理の前処理としてよく使用されます。特に、エッジ検出や特徴抽出の前に、不要な詳細やノイズを除去するために用いられます。GaussianBlurではガウス分布(正規分布)を用いたフィルタを使用します。GaussianBlurを使用すると、ピクセルの値は孫周辺のピクセルの値によってぼかされて、画像全体が滑らかになります。

出力結果

OpenCVのGaussianBlur関数を使った画像のスムージング

プログラム全体

#解説1 import cv2 import matplotlib.pyplot as plt import urllib import numpy as np #解説2 # サンプル画像をダウンロード url = 'https://raw.githubusercontent.com/opencv/opencv/master/samples/data/lena.jpg' with urllib.request.urlopen(url) as url: s = url.read() arr = np.asarray(bytearray(s), dtype=np.uint8) img = cv2.imdecode(arr, -1) # 'そのまま読み込む' #解説3 # 色スタイルをBGRからRGBに変換 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # ガウシアンブラーを適用 blur = cv2.GaussianBlur(img,(15,15),0) #解説4 # 元の画像とぼかした画像を表示 plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1), plt.imshow(img), plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(1, 2, 2), plt.imshow(blur), plt.title('Blurred') plt.xticks([]), plt.yticks([]) plt.show()

解説

解説1:必要なライブラリのインポート

import cv2 import matplotlib.pyplot as plt import urllib import numpy as np from PIL import Image

この部分では、プログラムで必要となるライブラリをインポートしています。ライブラリは、特定の機能を提供するコードの集まりで、これによりプログラムの開発が容易になります。各ライブラリの概要を紹介します。

cv2 OpenCVのライブラリ。画像処理やコンピュータビジョンのタスクを行うための関数が含まれています。
matplotlib.pyplot グラフ描画や画像表示などの視覚化機能を提供するライブラリ。
urllib URLを扱うためのライブラリ。ここでは画像をインターネットからダウンロードするために使用します。
numpy 数値計算を効率的に行うためのライブラリ。ここでは画像データを扱うために使用します。

エラー:urllibのimportエラーについて

例外が発生しました: AttributeError module 'urllib' has no attribute 'request' File "gaussian_blur.py", line 11, in <module> with urllib.request.urlopen(url) as url: AttributeError: module 'urllib' has no attribute 'request'

上記のエラーは、Pythonのurllibモジュールのrequest属性が見つからないことを指しています。Python2とPython3ではurllibモジュールの構造が異なり、Python3ではurllib.requestを使用しますが、Python2ではこのモジュールは存在しません。 したがって、このエラーはPython2でPython 3のコードを実行しようとしたときによく見られます。Pythonのバージョンを確認して、Python3を使用していることを確認してください。 もしこのエラーがPython3で発生している場合、urllib.requestを正しくインポートできていない可能性があります。以下のようにインポートしてみてください:

import urllib.request

解説2:画像のダウンロードと読み込み

# サンプル画像をダウンロード url = 'https://raw.githubusercontent.com/opencv/opencv/master/samples/data/lena.jpg' with urllib.request.urlopen(url) as url: s = url.read() arr = np.asarray(bytearray(s), dtype=np.uint8) img = cv2.imdecode(arr, -1)

この部分では、インターネットからサンプル画像をダウンロードし、OpenCVで扱える形式に変換しています。urllib.request.urlopen()を使ってURLからデータを取得し、cv2.imdecode()を使ってそのデータを画像として読み込んでいます。 np.asarrayでは、img_array(NumPy配列形式の生のバイトデータ)から画像をデコードしています。デコードとは、符号化された情報(この場合は画像データ)を元の形式(この場合は画像)に変換することを意味しており、-1は、画像を読み込むときに元の色空間を維持するためのフラグです。

補足:cv2.imdecode()とは?

画像データはJPEG、PNGなどの形式でエンコード(符号化)されたものを使用します、。JPEG、PNGなどの形式は、画像のピクセル情報を効率的に保存するためのもので、エンコードされたデータはバイナリ形式(つまり、0と1の列)で表現されます。しかし、このバイナリデータをそのままではOpenCVで処理することができません。 そのため、まずバイナリデータをNumPy配列に変換します。NumPyはPythonで数値計算を効率的に行うためのライブラリで、大量の数値データを高速に処理することができます。np.asarray関数は、入力データ(ここではバイナリデータ)をNumPy配列に変換します。この状態のNumpy配列からさらに画像データを取り出すためにcv2.imdecode()を使用します。cv2.imdecode()をすることでデータを直接メモリ上で操作できるため、データの変換や操作が容易になります。また、cv2.imdecodeは、多くの一般的な画像形式(JPEG、PNG、TIFFなど)をサポートしています。これにより、さまざまな形式の画像データを同じ方法で扱うことができます。

解説3:画像の前処理

# 色スタイルをBGRからRGBに変換 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # ガウシアンブラーを適用 blur = cv2.GaussianBlur(img,(15,15),0)

この部分では、画像の色空間をBGRからRGBに変換し、GaussianBlurを適用して画像をぼかしています。OpenCVは画像をBGR形式で読み込むのがデフォルトですが、matplotlibではRGB形式で画像を表示するのが一般的なため、色空間の変換が必要です。また、GaussianBlur関数は、ガウシアンブラーを適用するための関数で、第一引数に対象の画像、第二引数にカーネルのサイズ(ぼかしの範囲を決定する)、第三引数にガウシアンカーネルの標準偏差を指定します。標準偏差が大きいほど、ガウス分布は広がり、ぼかしの範囲が広くなります。逆に、標準偏差が小さいほど、ガウス分布は狭くなり、ぼかしの範囲が狭くなります。0を指定すると、カーネルのサイズから自動的に標準偏差が計算されます。 ここでは、カーネルのサイズを15x15、標準偏差を0に設定して、画像にガウシアンブラーを適用しています。

解説4:画像の表示

# 元の画像とぼかした画像を表示 plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1), plt.imshow(img), plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(1, 2, 2), plt.imshow(blur), plt.title('Blurred') plt.xticks([]), plt.yticks([]) plt.show()

この部分では、matplotlibライブラリを使用して、元の画像とぼかした画像を並べて表示しています。 plt.imshow()関数を使って画像を表示し、plt.title()関数を使って各画像にタイトルを付けています。 また、plt.xticks([]), plt.yticks([])を使ってx軸とy軸の目盛りを非表示にしています。

おまけ

上記ではカメラなどのデバイスから取得した画像に含まれるノイズを削減するために、平滑化処理を行っていますが、TheImagingSource社のビューワーソフト(IC Capture)では、画像フィルタを使用してノイズを除去する機能が提供されています。このソフトウェアは、カメラから送信される連続したフレームを平均化することでノイズを低減します。その結果、画像がぼけることなくノイズを削減することが可能となります。
https://www.argocorp.com/software/capture/ICCapture/ICCapture.html