📚

OpenCVからPIL、PILからOpenCVのデータ変換

2023/11/25に公開

OpenCVからPIL、PILからOpenCVのデータ変換

OpenCVで生成した画像をPILで読み込む、もしくは逆方向の操作をしたいと思った時に混乱したので整理してみることにした

結論

COLOR_RGB2BGR, COLOR_BGR2RGBでRGB(赤緑青)の並びを相互変換すればよい

PIL→OpenCV

import numpy as np
import cv2

def pil2cv(pil_image):
    cv_image = np.array(pil_image, dtype=np.unit8)
    if cv_image.ndim == 2: # モノクロ
        pass
    elif cv_image.shape[2] == 3: # カラー
        cv_image = cv2.cvtColor(cv_image, cv2.COLOR_RGB2BGR)
    else cv_image.shape[2] == 4: # 透過
        cv_image = cv2.cvtColor(cv_image, cv2.COLOR_RGBA2BGRA)
    return cv_image

OpenCV→PIL

from PIL import Image
import cv2

def cv2pil(cv_image):
    pil_image = cv_image.copy()
    if pil_iamge.ndim == 2: # モノクロ
        pass
    elif pil_image.shape[2] == 3: # カラー
        pil_image = cv2.cvtColor(pil_image, COLOR_BGR2RGB)
    elif pil_image.shape[2] == 4: # 透過
        pil_image = cv2.cvtColor(pil_image, COLOR_BGRA2RGBA)
    return pil_image

補足

変換が必要になるのはOpenCVがチャンネル(色)をBGRで扱うため
他のほとんどのライブラリはRGBで扱う(多分)
従ってOpenCVと他の画像関連ライブラリを合わせて使う場合には変換が必要となる

Discussion