import cv2
import numpy as np
imread() で画像データを読み込むことができます
引数: 画像のパス
img = cv2.imread(r"practice_exercise_data\img\opencv_img\demoimg_0000.jpg")
imshow で読み込んだ画像データを表示することができます
引数: ウィンドウ名, 表示する画像データ
※ jupyter notebookで imshow() を使用する場合、単体では使用できません
※ waitKey と destroyAllWindowsを使ってキー入力がされたときに画像を閉じるようにします。
cv2.imshow('image.jpg',img)
#何かしらのキー入力がされれば以降の処理を実行
cv2.waitKey(0)
#現在までに作られた全てのウィンドウを閉じる
#引数としてウインドウ名を渡すと特定のウインドウのみ閉じることができます
cv2.destroyAllWindows()
import glob
path = glob.glob(r"practice_exercise_data\img\opencv_img\*.jpg")
# prnit(path)
count = 0
while True:
#最後まで表示されたらループから抜ける
if count == (len(path) -1):
break
cv2.imshow('window', cv2.imread(path[count]))
#キーが押された時、押されたキーを数字で受け取ることができる
k = cv2.waitKey(0)
count += 1
#ESC, ENTERキーが押されたら次の画像へ
if k == 27 or k == 13:
continue
cv2.destroyAllWindows()
imwrite() で画像を書き出すことができます
引数: 画像名, 画像データ
※ 第一引数が画像名のみの場合、出力先はこの .ipynb と同じ階層になります
出力先を指定する場合、画像名と一緒に出力先ディレクトリを指定します。
img = cv2.imread(r"practice_exercise_data\img\opencv_img\demoimg_0000.jpg")
cv2.imwrite(r'practice_exercise_data\img\output\check.jpg', img)
getPerspectiveTransform() で、任意の四角形から別の任意の四角形に変換するための変換行列を作成することができます
引数: 返還前の4点, 返還後の4点
※対応する4点は順番があっている必要があります。今回はどちらも左上、右上、右下、左下の順で指定しています
※また、返還する画像と返還先の画像でサイズは同じにしておく必要があります
※ ここでは読み込んだ画像からサッカーフィールドの右側の形(赤枠で囲った部分)に変換するための変換行列を取得します
#変換前の四点
before = np.array([[0, 103], [1640, 103], [1920, 1030], [0, 1030]], dtype=np.float32)
#変換後の四点
after = np.array([[1185, 28], [1860, 28], [1788, 1050], [1365, 1050]], dtype=np.float32)
mat = cv2.getPerspectiveTransform(before, after)
print("変換行列")
print(mat)
warpPerspective() で変換行列を使い、実際に画像を変形させることができます
引数: 変換する画像, 変換行列, 画像サイズ
img = cv2.imread(r"practice_exercise_data\img\opencv_img\demoimg_0000.jpg")
perspective_img = cv2.warpPerspective(img, mat, (1920, 1080))
cv2.imshow('window', perspective_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cvtColor() で色空間を変更することができます
グレースケールも cvtColor() を使用して変換します
引数: 画像データ, 色空間
cv2 で読み込んだ画像の色配列は BGR
#Pillowは色空間がRGB
#今回はopencvがメインなので Pillow については説明しません
from PIL import Image
img = cv2.imread(r"practice_exercise_data\img\opencv_img\demoimg_0000.jpg")
pil_img = Image.fromarray(img)
pil_img.save(r'practice_exercise_data\img\output\bgr_pil.jpg')
cv2.imshow('image.jpg', cv2.imread(r'practice_exercise_data\img\output\bgr_pil.jpg'))
cv2.waitKey(0)
cv2.destroyAllWindows()
#RGB -> BGR
img_bgr = cv2.cvtColor(cv2.imread(r'practice_exercise_data\img\output\bgr_pil.jpg'), cv2.COLOR_RGB2BGR)
#BGR -> RGB
#cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.imshow('image.jpg',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#グレースケール
img = cv2.imread(r"practice_exercise_data\img\opencv_img\demoimg_0000.jpg")
im_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('image.jpg', im_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
resize() で画像サイズを変更することができます
引数: 画像データ, (横, 高さ)
shapeメソッド*1 は Numpy配列ndarray の各次元の形状(サイズ)をタプルとして取得
img = cv2.imread(r"practice_exercise_data\img\opencv_img\demoimg_0000.jpg")
height, width = img.shape[:2]
size = (int(width / 2), int(height / 2))
#画像サイズを半分に変更
half_img = cv2.resize(img, size)
cv2.imshow('image', half_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
*1
cv2で読み込んだ画像データは、カラー画像の場合は 行(高さ) x 列(幅) x 色(3) の三次元のndarray
[
[[0,0,0],[0,0,0][0,0,0][0,0,0][0,0,0]],
[[0,0,0],[0,0,0][0,0,0][0,0,0][0,0,0]],
...
[[0,0,0],[0,0,0][0,0,0][0,0,0][0,0,0]]
]
shape はサイズを取得するので (行(高さ), 列(幅), 色(3, [0, 0, 0])) のタプルが取得できます
img = cv2.imread(r"practice_exercise_data\img\opencv_img\demoimg_0000.jpg")
print(img.shape)