画像データのフォーマットまとめ(画像認識用)
ディープラーニングの画像認識デモを作っているときに
画像データのフォーマットを合わせるのに苦戦したので、
調べたことをまとめておきます。
OpenCV
OpenCVで扱う画像データはNumpy配列のndarray型
3次元の配列で高さ x 幅 x 色数
色の順番はRGBではなくBGR
import cv2 im = cv2.imread('test.jpg') print(type(im)) # <class 'numpy.ndarray'> print(im.shape) # サイズ(高さ x 幅 x 色数) # (480, 640, 3)
Pillow(PIL)
3rd partyの画像処理ライブラリ
GitHubで公開されているディープラーニングのコードには
Pillowで画像を読み込むものがある
画像を読み込んだ際の型はPIL型
画像の縦横サイズはsizeメソッドで取得
from PIL import Image img = Image.open('test.png') # 画像の読み込み print(type(img)) # <class 'PIL.PngImagePlugin.PngImageFile'>
print(img.size[0]) # 横 # 640
print(img.size[1]) # 縦 # 480
img.save("test2.png") # 画像の保存
Pillow(PIL) ⇔OpenCVへの変換
Pillow(PIL)で読み込んだ画像を Numpy配列のndarray型に格納することで
OpenCVと同様の形式に変換
色の順番はRGBとなり、ここがOpenCVと異なる
from PIL import Image import numpy as np im = np.array(Image.open('test.jpg')) # PIL型として画像を読み込み
print(im.dtype) # データ型 # uint8
print(type(im))
# <class 'numpy.ndarray'>
print(im.shape) # サイズ(高さ x 幅 x 色数)
# (480, 640, 3)
Pillow(PIL)形式に戻す場合はImage.fromarray()を用いる
pil_img = Image.fromarray(im) # ndarray型をPIL型に変換
サンプルコード
●Webカメラの映像を取得してPIL型に変換し、推論処理を行う
import cv2 from PIL import Image import numpy as np vid = cv2.VideoCapture("読み込む動画のパス") # オブジェクト生成 return_value, frame = vid.read() # 動画のフレームを読み出し
# ndarray型をPILのイメージオブジェクトに変換 これを推論にかける image = Image.fromarray(frame)
●推論した結果を動画として保存する
import cv2 from PIL import Image import numpy as np # オブジェクト生成 out = cv2.VideoWriter("保存する動画のパス", video_FourCC, "動画のfps", "動画の解像度")
# 推論した結果の画像(PIL型)をndarray型に変換 result = np.asarray(image)
out.write(result) #動画の保存