この記事では、PythonでOpenCVとBase64を使って画像を処理する方法について説明します。具体的には、画像をBase64形式に変換し、その後、Base64形式から画像に戻す方法を示します。
OpenCVとBase64を使って画像を変換する
まず、PillowのPIL.ImageからBase64文字列に変換する方法を見てみましょう。
import base64
from io import BytesIO
from PIL import Image
def pil_to_base64(img, format="jpeg"):
buffer = BytesIO()
img.save(buffer, format)
img_str = base64.b64encode(buffer.getvalue()).decode("ascii")
return img_str
# 画像を読み込む
img = Image.open("sample.jpg")
# base64 文字列 (jpeg) に変換する
img_base64 = pil_to_base64(img, format="jpeg")
次に、Base64文字列からPillowのPIL.Imageに変換する方法を見てみましょう。
def base64_to_pil(img_str):
if "base64," in img_str:
img_str = img_str.split(",")[1]
img_raw = base64.b64decode(img_str)
img = Image.open(BytesIO(img_raw))
return img
# base64 文字列
img_base64 = "/9j/4AAQSkZJRgABAQEBLAEsAAD/4QEsRXhpZgAATU0AKgAAAAgABQEPAAIAAAAYAAAASgEQAAIAAAARAAAAYgESAAMAAAABAAEAAIKaAAUAAAABAAAAdIdpAAQAAAABAAAAf..."
# PIL.Image 形式に変換する
img = base64_to_pil(img_base64)
これで、PythonのPillowライブラリを使って画像をBase64形式に変換し、Base64形式から画像に戻す方法を学びました。
OpenCVとBase64を使って画像を変換する
次に、OpenCVを使って同じことを行う方法を見てみましょう。
import base64
import numpy as np
import cv2
# base64 to OpenCV Image
with open("test.jpg", "rb") as f:
im_b64 = base64.b64encode(f.read())
im_bytes = base64.b64decode(im_b64)
im_arr = np.frombuffer(im_bytes, dtype=np.uint8)
img = cv2.imdecode(im_arr, flags=cv2.IMREAD_COLOR)
このコードは、まず画像を読み込み、それをBase64形式にエンコードします。次に、そのBase64エンコードされた文字列をデコードし、バイト配列に変換します。最後に、そのバイト配列をNumPy配列に変換し、それをOpenCVの画像(BGR形式)に変換します。
以上がPythonでOpenCVとBase64を使って画像を処理する方法です。これらのコードを使って、画像をBase64形式に変換し、その後、Base64形式から画像に戻すことができます。これは、画像をテキスト形式で保存したり、テキスト形式で送信したりする場合に非常に便利です。