ハードウェア技術者のスキルアップ日誌

某家電メーカーの技術者がスキルアップのために勉強したことを記録するブログです

画像データのフォーマットまとめ(画像認識用)

ディープラーニングの画像認識デモを作っているときに
画像データのフォーマットを合わせるのに苦戦したので、
調べたことをまとめておきます。

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)      #動画の保存

 

参考サイト

https://note.nkmk.me/python-opencv-imread-imwrite/

https://qiita.com/derodero24/items/f22c22b22451609908ee