【Python】OpenCVによる画像処理について:基本的なメソッドの使い方
2022.10.21 /
本記事ではPythonのOpenCVを利用した画像処理の方法や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と共に利用します。
NumPyは高速な科学計算を行うためのライブラリです。機械学習などで利用されることが多いです
利用用途
OpenCVは以下のような用途に利用されることが多いです。
- 顔認識
- 文字認識(OCR)
- 物体検出
- 画像のマッチング
最近では特に機械学習のようなAI開発で利用されることが多くなりました。機械学習の勉強を始めると画像認識の項目でOpenCVを利用するでしょう。
OpenCVのインストールとインポート
OpenCVのインストール
OpenCVは標準ライブラリではないため、次のようにpipコマンドでインストールする必要があります。
pip install opencv-python
もし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()
上記では高さ(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などが指定できます。
ここでは次図に文字列を描画してみます。
以下スクリプトを実行して、「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()
画像に円を記入(描画):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()
画像に長方形を記入(描画):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による画像処理について:基本的なメソッド使い方」はいかがでしたか。
OpenCVは画像処理や顔認識といった様々な分野で利用されます。機械学習や人口知能といった難しそうな分野でも活躍しているライブラリです。
ぜひOpenCVを使えるようになって、高度なアプリケーションを作成できるようになりましょう。