福岡人データサイエンティストの部屋

データサイエンスを極めるため、日々の学習を綴っています。

【OpenCV】画像の操作練習【Python】



こんにちは!こーたろーです。


画像解析している割には、OpenCVの基礎やってなかったなーって思って、少しやることにしました。


本当に基礎なので、本日は初級者向けです。


OpenCVで画像の取扱いを少しやっていきます。


それでは早速参りましょう。


画像の取得



画像をWebから取得していきます。


フリーの画像を検索して、ファイルリンクをコピーしておきましょう。

import cv2
import urllib.request as req

url = "https://jp.static.photo-ac.com/assets/img/ai_page/ai_model_512_01.png"
req.urlretrieve(url, "face_test.png")

img = cv2.imread("face_test.png")
print(img)



urllibのrequestを使って、urlにアクセスします。


そして、ファイル名を付けて読み込みます。


今回、imgファイルに読み込んだのはpngファイルになります。


どのようなデータが取り込まれているかを確認すると、





このようになっています。


配列の形状を確認します。

img.shape






512×512ピクセルの3チャネルのデータ構造になっています。
3チャネルはRGBの画素数を表しているため、先ほどのデータではRGBの3つのリストが512×512の配列で入っているということになります。

画像の表示



取り込んだ画像を表示させます。


OpenCVはmatplotlibと互換性があるので、matplotlibで表示させます。

import matplotlib.pyplot as plt
%matplotlib inline

#plt.axis("off")
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()



軸の表記が邪魔な場合はplt.axis(”off”)をアクティブにしてください。


matplotlib.pyplotのimshow()関数で画像を表示させます。


この時の注意点としては、cv2.imreadで取り出した画像は、RGBの順番ではなく、GBRの順番になっていることです。


matplotlib.pyplotのimshow()関数では、RGBの順番で引数に渡さないといけないため、cvtColor関数にて、BGRからRGBに変換しなくてはなりません


表示結果はこのようになります。




画像の保存



画像を保存していきます。


imwrite関数で、保存後のファイル名とファイルデータの入った変数を指定します。

cv2.imwrite("output.png", img)






Trueと出力されれば、成功です。

画像のリサイズ



画像のリサイズを行っていきます。


リサイズは、cv2.resize()関数で簡単に行うことができます。


元画像のサイズは512×512でしたので、それを600×300にしてみます。

img2 = cv2.resize(img, (600, 300))
plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))
plt.show()



結果としては、





このように、引き伸ばされた形で出てきます。原因は、もともとのアスペクト比(縦横比)とは異なるサイズを指定しているからです。


アスペクト比が異なる場合は、画像を変更後のアスペクト比で切り取ってリサイズを行いましょう。

画像の切り取り



画像の切り取りを行っていきます。


今回は、元画像から顔の部分を中心に切り取ります。


imgのデータをスライスを使ってデータを取り出すことで切り取りができます。


画像の左上の座標が(0,0)、右下の座標が(512、521)ですので、ちょうどいいサイズに切り取ります。


また、リサイズ(400,400)して表示させることも考えて、アスペクト比も1:1になるように切り取ります。

img3 = img[0:400,50:450]
img3 = cv2.resize(img3, (400,400))

plt.imshow(cv2.cvtColor(img3, cv2.COLOR_BGR2RGB))
plt.show()



結果は





顔の拡大画像を取り出すことができました。


OpenCVの基礎編はまだまだ続きます!


ではでは。


OpenCVではじめよう ディープラーニングによる画像認識