PythonによるOpenCV入門

このチュートリアルでは、Python で OpenCV ライブラリを使用する方法を学びます。OpenCVは、Windows、Linux、MacOSを含む複数のプラットフォームでサポートされ、他の複数の言語でも利用可能なオープンソースライブラリですが、機械学習アプリケーション、特にコンピュータビジョン分野でPythonが最もよく利用されています。

OpenCVは、そのクロスプラットフォームのサポートと、他の複数のコンピュータ言語で利用可能なことから、開発されたアプリケーションを異なるシステムで使用することが可能です。また、他のライブラリと比較して、ほとんどの関数にベクトル演算を使用しているので、計算の面でかなり効率的なライブラリです。

このチュートリアルでは、Mac、Windows、Linux上でのOpenCVのインストール、画像操作、画像演算、画像スムージング、OpenCVを使った幾何学変換について説明します。では、早速始めましょう。

インストール

注意:OpenCV を Python 言語で利用するため,お使いのコンピュータに Python (version 3) がインストールされていることが暗黙の条件となります.お使いのOSに応じて,以下のコマンドのいずれかを実行して,OpenCVライブラリをシステムにインストールしてください.

Windows

$ pip install opencv-python


MacOS

$ brew install opencv3 --with-contrib --with-python3


Linux

$ sudo apt-get install libopencv-dev python-opencv


インストールが成功したかどうかを確認するには、Pythonシェル、またはコマンドプロンプト/ターミナルで以下のコマンドを実行します。

import cv2


cv2` のインポートでエラーが発生しなければ、正しくインストールされています。

基本的な画像操作

OpenCV をワークステーションにインストールしたので、OpenCV が提供する機能のいくつかを実際に使ってみましょう。

画像を表示する

OpenCV を用いた画像の表示は,まず画像をロードし,次にそれを表示する,という2つのステップで行われます.この2つの操作は,異なる関数を用いて順番に行われます.

画像を表示するためには,2つのことが必要です.

  1. 画像のパス(絶対パスと相対パスの両方が機能する)
  2. 読み込みモード(読み込み、書き込みなど)

画像の読み込み/ロードに利用する関数は cv2.imread() で,これには2つのバリエーションがあります.最初のものは IMREAD_GRAYSCALE で,これはその名前が示すように,画像を読み込む前にグレースケールに変換します.もう 1 つは IMREAD_UNCHANGED で、アルファチャンネルを切り出すことなく画像を読み込みます。デフォルトは IMREAD_COLOR で、これは単に RGB チャンネルのみを使用してカラー画像を読み込みます。

例としてコードを書いてみましょう。

import cv2


my_bike = cv2.imread('bike.png')


これは、ファイルシステムから自転車の画像を読み込み、それを my_bike 変数に格納し、さらに操作を行うものです。

注意:もし上記のコードでエラーが発生した場合、考えられる理由は3つだけです。1つ目は指定したパスが正しくないこと、2つ目は指定した画像ファイルが存在しないこと、そして最後の1つは画像パスの中の画像タイプ(jpg/jpeg/png)が正しくないことです。

それでは、先ほど読み込んだ画像を表示してみましょう。これは,関数 cv2.imshow() によって行うことができます.Matlabを使ったことがある人なら,これらの画像操作に馴染みがあるかもしれません.

cv2.imshow('my_bike', my_bike)


imshow()関数の最初のパラメータは,イメージウィンドウに表示したい文字列の名前です.第2パラメータは,cv2.imread()` 関数で作成したイメージハンドラです.

画像の保存

画像の保存は,非常によく利用される機能です.なぜなら,後で利用するために画像を更新し,その変更点をファイルシステムに保存する必要があるかもしれないからです.OpenCV には,画像を保存するための関数 cv2.imwrite() が用意されています.

以下はその例です.

cv2.imwrite('bike.png', my_bike)


ここでは,画像の名前と現在の保存場所を指定します.作成された画像は,自動的にカレントワーキングディレクトリに保存されます.

画像に対する算術演算

画像の演算とは、複数の画像を加算、減算、乗算、除算して、入力画像の算術的な組み合わせである新しい画像を生成することである。画像演算は、画像に透かしを入れたり、2枚の画像を合成したり、さまざまな画像フィルターを適用するなど、さまざまな応用が可能です。

実行できる演算はたくさんありますが、ここでは2つの例のみを紹介します。これは、OpenCVで利用できる他の演算に概念を適用できるようにするためです。最初の例は2枚の画像の加算、2番目の例は2枚の画像のブレンドです。

それでは、この2つの例をコード化してみましょう。

画像を追加する

import cv2


# Read in the two images
image_1 = cv2.imread('bike.jpg')
image_2 = cv2.imread('car.jpg')


# Sum the two image arrays for all channels
result = cv2.add(image_1, image_2)


cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()


waitKey` コマンドはキーを押すのを待ってから次のコマンドに進みます。これはキーが押されるまでプログラムが画像を表示し続けるのに便利で、そうしないと一瞬だけ表示された後、プログラムの実行が停止してすぐに消えてしまいます。

画像のブレンド

画像のブレンドは、画像の追加と似ていますが、新しい結果画像に対する各画像の寄与を制御できる点が異なります。基本的に、2つの画像を合成するときに、片方の画像をより強調し、もう片方の画像をより淡くしたい場合は、単純な加算ではなく、ブレンディングを使用します。

では、その方法を説明しましょう。

import cv2


# Read in the two images
image_1 = cv2.imread('bike.jpg')
image_2 = cv2.imread('car.jpg')


result = cv2.addWeighted(image_1, 0.9, image_2, 0.1)


cv2.imshow('result', result)
cv2.waitKey(0) # Wait for the user to press a key before continuing
cv2.destroyAllWindows()


addWeighted`関数に与えられる重みの合計は1.0に等しくなければなりません。また、最後にスカラー値を与えれば、結果画像のすべてのピクセル値に加算されます。

注意:画像はどのようなタイプでも構いませんが、タイプはすべての画像で同じであるべきです。例えば、PNG形式を使用する場合、計算に使用する画像もすべてPNG形式でなければならない。

画像スムージング

画像のスムージングは非常に有用な機能であり、機械学習モデルに画像を渡す前に行われることがほとんどである。ローパスフィルタを通すことで、画像からノイズや高周波成分を除去するのが主な方法である。ボックスフィルタ(平均化フィルタ)、メディアンフィルタ、モードフィルタ、ガウシアンフィルタなど多くのフィルタがありますが、画像のスムージングとOpenCVを使ったその方法を理解するために、ここではボックスフィルタのみを取り上げることにします。

例えば、10×10の画像があり、それを3×3のボックス/平均化フィルタにかけたい場合、どのように行うのでしょうか?

まず画像の左上から始めて、そこに3×3フィルタを置き、中央の要素を9つの要素の平均値に置き換えます。これが最初のステップで、次にフィルターを一歩右に移動し、画像全体を覆うまで同じ作業を繰り返します。参考までに 10×10 の画像と 3×3 の平均化フィルタの例を以下に示します。

フィルター/マスク

10×10画像に適用中のフィルター

さて、ここまででOpenCVがどのように動作するかを説明しましたが、次はOpenCVを使って画像にさまざまなフィルタを適用する方法を試してみましょう。

import cv2


# Load the original image
original_image = cv2.imread('my_bike.png')


# Filter by passing image through 3x3 averaging filter
average_image = cv2.blur(original_image,(3,3))


# Apply 3x3 gaussian filter on the original image
gaussian_image = cv2.GaussianBlur((original_image,(3,3),0))


# Apply 3x3 median filter on the original image
median_image = cv2.medianBlur(original_image,3)


注:以下のコードを追加することで、結果の画像を見ることができます。

import matplotlib.pyplot as plt


plt.imshow(average_image)
plt.show()


画像変換

画像変換は、OpenCVでカバーする最後の、しかし最も重要なトピックの1つです。これは多くのアプリケーションを持っていますが、最近最も一般的なものの1つは、データ補強のための機械学習で、すなわち、データセットが不足しているとき、既存のデータセットとは異なるように、現在利用可能な画像を補強/変換します。これにより、データセットのサイズが効果的に増加し、モデルの精度を向上させることができるかもしれません。

可能な変換のリストは、スケーリング、アフィン、回転、移動などを含む長いものです。ここでは,一般的な考えを得るために,OpenCV を用いてそのうちの2つだけを取り上げます.しかし,OpenCV は様々な変換のためのサポート関数を提供します.まず,スケーリングから始めましょう.

スケーリング

簡単に言うと,スケーリングとは基本的に画像のサイズを変更すること,つまり,大きくしたり小さくしたりすることです.resizeは,OpenCV において画像のサイズを変更するために利用される関数です.リサイズには3つの種類があります.INTER_CUBICINTER_LINEARINTER_AREA です。これらの関数を用いてスケーリングを行う例を示します。コード、コメント、説明をよく読んで、コードの中で何が起こっているのかを正確に理解してください。

import cv2
import numpy as np
import matplotlib.pyplot as plt


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


# Scale up/expand both width and height by factor of 2
result_1 = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)


# Scale down/shrink both width and height by factor of 2
result_2 = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_AREA)


# Display the resulting images
plt.imshow(result_1)
plt.imshow(result_2)
plt.show()


ここで、 resize 関数の fx パラメータは幅のスケールファクター、 fy は高さのスケールファクター、 interpolation はスケーリング(縮小または拡大)に使用する関数を指定します。

ローテーション

回転は,画像を軸としてある特定の角度だけ動かすことができます.

コードを用いて画像を回転させる方法を学ぶ前に,この変換を行うために使用される回転行列があることを知っておく必要があります.ここでは,その詳細については触れませんが,OpenCV では,1つの関数呼び出しでその行列を計算することができるので,非常に簡単です.以下のコードで,それを見ることができます.

import cv2
import matplotlib.pyplot as plt


# Load the image of a bike
image = cv2.imread('my_bike.jpg',0)


# Rows and columns
r, c = image.shape


matrix = cv2.getRotationMatrix2D((cols/2,rows/2), 180, 1)
result = cv2.warpAffine(image,matrix,(c,r))


# Display resulting rotation
plt.imshow(result)
plt.show()


関数 getRotationMatrix2D において,180 は画像を回転させる度合い,1 はスケーリングファクタを表し,この関数は,変数 matrix に回転行列を返します.

関数 warpAffine の呼び出しでは、前のメソッドで計算した行列を使用して、指定に従ってイメージを回転させます。

結論

最後に、この記事で説明したいくつかの重要なポイントについて再確認しておきましょう。OpenCV は複数の言語で利用可能なライブラリであり,上記のいくつかの例で見たように,主に NumPy, SciPy, Matplotlib と一緒に利用されます.その関数のいくつかは Matlab と同じで、ベクトル化された演算もサポートしており、それ故に計算効率が上がります。

さらに、OpenCVはコンピュータビジョン分野で最も優れたライブラリの1つで、この記事を読んだ後、OpenCVを使って開発されたコンピュータビジョン/機械学習アプリケーションを検索することができるようになるはずです。

この記事は氷山の一角に過ぎず、OpenCVはまだまだ多くのことを提供できることをお知らせします。この記事を読めば、OpenCVが提供する他の高度な機能をより深く知ることができるようになるはずです。

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