【Python】OpenCVによる画像処理について:基本的なメソッドの使い方

時計 2022.10.21 / 時計

【Python】OpenCVによる画像処理について:基本的なメソッドの使い方

記事ではPythonOpenCVを利用した画像処理の方法やOpenCVの基本的な使い方について解説していきます。

Pythonの画像処理ライブラリとしてはOpenCVやPillowなどが存在します。本記事で紹介するOpenCVは他のライブラリに比べて高度な画像処理ができるという特徴があります。

画像処理や顔認識、機械学習などをPythonで行う場合、OpenCVを利用する場面が多いです。ぜひ本記事を参考にして、OpenCVについて理解を深めてください。

OpenCV

OpenCVとは

OpenCVとは画像処理や動画処理、画像解析に利用されるライブラリです。

OpenCVはインテル社が開発しており、オープンソースとして無料で配布されています。商用の利用であっても無料で使うことができるため、幅広く利用されています。

Pythonの標準ライブラリではないため、別途インストールする必要があります。

OpenCVは現在(2022年10月17日)のバージョンが4.6.0.66です。バージョン4系はPythonだけでなく、JavaやC++でも利用できます。またOSもWindowsやMac、Linux、Android、iOSなど様々な端末で使えます。

PythonでOpenCVを利用する際、画像はNumPyのndarray形式で扱われます。OpenCVは行列の計算が不得意なため、基本的にはNumPyと共に利用します。

Pythonライブラリの確認

NumPyは高速な科学計算を行うためのライブラリです。機械学習などで利用されることが多いです

利用用途

OpenCVは以下のような用途に利用されることが多いです。

  • 顔認識
  • 文字認識(OCR)
  • 物体検出
  • 画像のマッチング

最近では特に機械学習のようなAI開発で利用されることが多くなりました。機械学習の勉強を始めると画像認識の項目でOpenCVを利用するでしょう。

OpenCVのインストールとインポート

OpenCVのインストール

OpenCVは標準ライブラリではないため、次のようにpipコマンドでインストールする必要があります。

pip install opencv-python
python:OpenCVのインストール

もしNumPyがインストールされていない環境であれば、合わせてNumPyもインストールされます。

OpenCVのインポート

OpenCVを利用するには必ずプログラムの先頭でOpenCVをインポートする必要があります。

import cv2

import OpenCVではなくcv2をインポートして使用するので注意してください。

上記コマンドを実行してエラーが出ていなければインストールは成功しています。

OpenCV:画像の読み込みと保存

画像の読み込み:imread()

OpenCVで画像を読み込むにはimread()メソッドを使用します。

構文

cv2.imread(path (, flag))

imread()の引数pathには画像のファイル名を指定します。同じ階層にあるファイルであればファイル名で指定、別のフォルダにある画像であれば絶対パスまたは相対パスで指定します。

第二引数flagには画像の読み込み方法を指定することができます。

flag値 説明
1(cv2.IMREAD_COLOR) カラー画像として読み込み
0(cv2.IMREAD_GRAYSCALE) グレースケール画像として読み込み
-1(cv2.IMREAD_UNCHANGED) アルファチャンネルを含んだ画像として読み込み

引数pathで指定した画像が存在しなくてもエラーは発生せず、print()を実行すると「None」と表示されます。

以下にimread()の使用例を記します。

import cv2

path = "test.png"
img = cv2.imread(path)

上記のようにimread()で読み込んだ画像情報は変数に格納します。

画像の保存:imwrite()

OpenCVで処理した画像を保存するにはimwrite()メソッドを使用します。

構文

cv2.imwrite(filename, image)

imwrite()の第一引数filenameには保存するファイル名、第二引数imageには保存する画像を指定します。

OpenCV:基本的な画像操作・画像処理

画像の表示:imshow()、destroyAllWindows()

imread()で読み込んだ画像を表示するにはimshow()メソッドを使用します。

構文

cv2.imshow(window_name, image)

imshow()の第一引数window_nameには表示されるウィンドウの名前、第二引数imageにはimread()で読み込んだ画像を指定します。

注意

複数の画像をimshow()で表示する場合は、各ウィンドウには異なる名前を付けてください

cv2.imshow()で画像を表示したら、必ずcv2.destroyAllWindows()で画像が表示されているウィンドウを閉じましょう。

import cv2

path = "test.png"
img = cv2.imread(path)
cv2.imshow("test_image", img)
cv2.destroyAllWindows()

しかし上記のコードでは一瞬で開いた画像は閉じてしまいます。そこでcv2.waitKey(0)を使って任意の時間表示した状態にします。

構文

cv2.waitKey(time)

引数timeには待機時間(ミリ秒)を指定します。を指定するとキーが押されるまで待機状態を維持します。

上記より、画像をOpenCVで表示する場合は以下のように記述することが多いです。

import cv2

path = "test.png"
img = cv2.imread(path)
cv2.imshow("test_image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

画像の高さ・横幅を取得:shape

画像の高さ・横幅を取得するにはshapeを使用します。shapeを画像オブジェクトに対して使用すると高さ、横幅、チャネルを返します。

import cv2

path = "image.png"
img = cv2.imread(path)
print(img.shape)
# (298, 640, 3)

画像の高さや横幅を変数に格納したい場合は次のように記述します。

import cv2

path = "C:\EAS\image.png"
img = cv2.imread(path)
# 高さを変数heightに格納
height = img.shape[0]
# 横幅を変数widthに格納
width = img.shape[1]

画像のトリミング:スライスを利用

画像をトリミングするにはスライスを利用すると簡単にできます。以下に実行例を記します。

import cv2

path = "image.png"
img = cv2.imread(path)
trim = img[0:100, 0:300]
cv2.imshow("test_image", trim)
cv2.waitKey(0)
cv2.destroyAllWindows()
python OpenCV:画像のトリミング

上記では高さ(y軸)を0~100、横幅(x軸)を0~300で指定してトリミングを実行しています。

画像のリサイズ:resize()

imread()で読み込んだ画像をリサイズするにはresize ()メソッドを使用します。

構文

①:cv2.resize(image, dsize=(高さ、横幅))
②:cv2.resize(image, dsize=None, fx=倍数, fy=倍数)

上記のようにresize()を利用してリサイズする方法は2種類あります。1はサイズを指定して変更する方法であり、2は比率を指定して変更する方法です。

以下では比率を変更した方法の例を記します。

import cv2

path = "image.png"
img = cv2.imread(path)
resize = cv2.resize(img, dsize=None, fx=0.5, fy=0.5)
cv2.imshow("test_image", resize)
cv2.waitKey(0)
cv2.destroyAllWindows()

画像のグレースケール(白黒)化:cvtColor()

画像をグレースケール(白黒)化するにはcvtColor()メソッドを使用します。

構文

cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

画像をグレースケール化(白黒)に変換することで画像のノイズを減らし、認識率を高めることができます。

OpenCV:画像への描画

画像に文字列を記入(描画):putText()

imread()で読み込んだ画像に文字列を書き込むにはputText()メソッドを使用します。

構文

cv2.putText(img, text, org, font, fontScale, color, thickness, lineType)

パラメーター 説明
img imread()で読み込んだ画像
text 書き込むテキスト
org 画像上に書き込むテキストの位置
font テキストのフォント
fontScale フォントのスケール
color フォントの色(RGB)
thickness 文字の太さ
lineType ラインタイプ

fontで指定できるフォントの一例を以下に記します。

フォント値 説明
cv2.FONT_HERSHEY_SIMPLEX 普通サイズのsans-serif
cv2.FONT_HERSHEY_PLAIN 小さいサイズのsans-serif
cv2.FONT_HERSHEY_DUPLEX 普通サイズのsans-serif(SIMPEXよりも複雑)
cv2.FONT_HERSHEY_COMPLEX 普通サイズのserif
cv2.FONT_HERSHEY_COMPLEX_SMALL FONT_HERSHEY_COMPLEXよりも小さい

lineTypeではcv2.FILLEDやLINE_4、LINE_8、LINE_AAなどが指定できます。

ここでは次図に文字列を描画してみます。

Python OpenCV:サンプル画像

以下スクリプトを実行して、「Hello」という文字列を描画します。

import cv2

path = "image.png"
img = cv2.imread(path)
cv2.putText(img, "Hello", (240, 50), cv2.FONT_HERSHEY_DUPLEX, 2, (255, 255, 255), 2, cv2.LINE_AA)
cv2.imshow("test_image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Python OpenCV:画像に文字列を描画

画像に円を記入(描画):circle()

画像に円を記入(描画)するにはcircle()メソッドを利用します。

構文

cv2.circle(image, center_coordinates, radius, color, thickness)

パラメーター 説明
image imread()で取得した画像オブジェクト
center_coordinates 円の中心座標。(x座標, y座標)とタプル値で指定
radius 円の半径
color 円の境界線の色。BGRのタプル値で指定
thickness 円の境界線の太さ。-1を指定した場合は円を塗りつぶす

以下に赤い円を描画する例を記述します。

import cv2

path = "image.png"
img = cv2.imread(path)
cv2.circle(img,(100,100), 50, (0,0,255), 3)
cv2.imshow("test_image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Python OpenCV:画像に赤い円を描画

画像に長方形を記入(描画):rectangle()

画像に長方形を記入(描画)するにはrectangle()メソッドを利用します。

構文

cv2.rectangle(image, start_point, end_point, color, thickness)

パラメーター 説明
image imread()で取得した画像オブジェクト
start_point 長方形の開始座標(左上の頂点)。(x座標, y座標)とタプル値で指定
end_point 長方形の終了座標(右下)。(x座標, y座標)とタプル値で指定
color 長方形の境界線の色。BGRのタプル値で指定
thickness 長方形の境界線の太さ。-1を指定した場合は長方形を塗りつぶす

以下に赤い長方形を描画する例を記します。

import cv2

path = "image.png"
img = cv2.imread(path)
cv2.rectangle(img,(100,100), (200, 200), (0,0,255), 3)
cv2.imshow("test_image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Python OpenCV:画像に赤い枠の長方形を描画

まとめ

本記事「【Python】OpenCVによる画像処理について:基本的なメソッド使い方」はいかがでしたか。

OpenCVは画像処理や顔認識といった様々な分野で利用されます。機械学習や人口知能といった難しそうな分野でも活躍しているライブラリです。

ぜひOpenCVを使えるようになって、高度なアプリケーションを作成できるようになりましょう。