見出し画像

OpenCVのimencodeとimdecodeでのbytesのやりとり

画像をimreadで読み込んだ後に、imencodeで取得したbytesを再度imdecodeで画像データに戻すメモです。

画像の読み込みと一部切り取り

ついでに切り取りもしちゃってます。

import cv2

fp = os.path.join(PATH_TO_IMAGE_DIR, IMAGE_NAME)
image = cv2.imread(fp)
crop = image[100:200, 100:200]

print(type(crop))
# <class 'numpy.ndarray'>

ちなみにGoogle Colabだと以下で画像の確認ができます。

from google.colab.patches import cv2_imshow

cv2_imshow(crop)

imencodeでbytesを取得

今回読み込んだ画像はpngでしたので。

retval, buf = cv2.imencode('.png', crop)
# retval -> True
# buf -> array([137,  80,  78, ...,  66,  96, 130], dtype=uint8)

crop_bytes = buf.tobytes()

print(type(buf))
# <class 'numpy.ndarray'>

print(type(crop_bytes))
# <class 'bytes'>

imdecodeで再度画像データに戻す

imdecodeにはbytesは渡せないので、一度ndarrayに変換してあげる必要があります。

crop_ndarray = np.frombuffer(crop_bytes, np.uint8)

print(type(crop_ndarray))
# <class 'numpy.ndarray'>

decoded = cv2.imdecode(crop_ndarray, cv2.IMREAD_UNCHANGED)

print(type(decoded))
# <class 'numpy.ndarray'>

cv2_imshow(decoded)


この記事が気に入ったらサポートをしてみませんか?