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)
この記事が気に入ったらサポートをしてみませんか?