OpenCVというライブラリをご存知でしょうか。
OpenCVとは、Intel社により開発されたオープンソースの画像処理ライブラリであり、C++やPythonで利用されることが多いです。
また、最近のAIブームにおいて、モデル開発の代替手段として利用されるくらいパワフルなライブラリとなっています。
今回は、OpenCVの基本的な操作である画像の読み込み・表示・保存について紹介したいと思います。
画像を読み込む
OpenCVで画像を読み込む際には、cv2.imread() とコードで書きます。
cv2.imread() に読み込みたい画像の相対パスを渡すこと画像を読み込むことができます。
パラメータを指定することができますが、必須ではなく指定がない場合は3チャンネルカラー画像として読み込まれます。
import cv2
# 画像を3チャンネルカラー(BGR)として読み込み
img = cv2.imread("test.jpg")
パラメータに 0 を指定することでグレースケールとして読み込みを行う事もできます。
import cv2
# 画像をグレースケールで読み込み
img = cv2.imread("test.jpg", 0)
補足ですが、読み込んだ画像はNumpy配列であり 正確には [Height][Weight][Color] の配列として読み込みが行われています。
これは .shape を利用して確認することができます。
import cv2
# 画像を3チャンネルカラー(BGR)として読み込み
img = cv2.imread("test.jpg")
# Height(高さ) x Width(幅) x Color(色) の順
# 例. (830, 710, 3)
print(img.shape)
グレースケールで読み込んだ場合はどうでしょうか。
グレースケールの画像は、R・G・Bを合成した画像になるため、Numpy配列の最後のカラーインデックスが消失した形状となります。
import cv2
# 画像をグレースケールで読み込み
img = cv2.imread("test.jpg", 0)
# Height(高さ) x Width(幅) の順
# 例. (830, 710)
print(img.shape)
画像を表示する
読み込みが行えたことを確認するために読み込んだ画像を表示してみます。
画像を表示する際には、cv2.imshow() と書きます。
第一引数に表示するウィンドウ名、第二引数に読み込んだ画像を指定します。
表示では、自動的にウィンドウが立ち上がり、またサイズも表示する画像サイズに自動的に最適化されます。
複数のウィンドウを同時に表示することもできますが、その場合は第一引数で指定するウィンドウ名を異なったものにする必要があります。
このとき同時に用いられる関数として、cv2.waitkey() と cv2.destroyAllWindows() があります。
cv2.waitKey() はキーボード入力を処理する関数で、引数には入力待ち時間をミリ秒単位で指定します.
引数に 0 を指定することで、何か入力が行われるまで待機が行われるため、実際にはこの方法が一般的です。
cv2.destroyAllWindows() は現在までに作られた全てのウィンドウを閉じる関数です.
特定のウィンドウのみを閉じる場合は cv2.destroyWindow() に閉じたいウィンドウ名を指定する必要があります。
import cv2
# 画像を3チャンネルカラー(BGR)として読み込み
img = cv2.imread("test.jpg")
# 画像を表示する
cv2.imshow('image',img)
# キーボード入力を待つ
cv2.waitKey(0)
# すべてウィンドウを閉じる
cv2.destroyAllWindows()
こんな形で表示されるはずです。
画像を保存する
画像を保存するには cv2.imwrite() とコードで書きます。
第一引数に保存するファイルパス、第二引数に保存する画像を指定します。
ファイルパスにはファイル名まで含めてしまいます。
また、保存形式は .png、.jpg 等指定することができます。
個人的にはファイル名の箇所のみ format関数を利用した次の形式をよく利用します。
import cv2
# 画像を3チャンネルカラー(BGR)として読み込み
img = cv2.imread("test.jpg")
fileName = "coffee"
# 画像を保存する
# 例. coffee.pngとして保存される
cv2.imwrite("{}.png".format(fileName), img)
最後に
以上、OpenCVを利用した画像利用の初歩についての記事でした。
今回は画像加工の部分がなくあまり納得感が無いかもしれませんが、今後バンバン記事にしていきますので期待してください。
今回も最後までお読みいただきありがとうございました。
では。