Pynote

Python、機械学習、画像処理について

matplotlib - OpenCV の画像を matplotlib で表示する方法について

概要

OpenCV の画像を matplotlib で表示する際の注意点について


使用する画像

OpenCV のカラー画像を表示する場合

OpenCV のカラー画像を matplotlib で表示した場合、以下のように色がおかしくなってしまう。
これは、OpenCV ではチャンネルの並び順が BGR と解釈するのに対し、matplotlib では RGB で解釈するのが原因である。
BGR の順で格納されている値を RGB の順で解釈した結果、色が反転している。

color = cv2.imread('apple.jpg')
plt.imshow(color)
plt.show()

表示する前にチャンネルの並びを BGR から RGB に変換すればよい。

rgb = cv2.cvtColor(color, cv2.COLOR_BGR2RGB)
plt.imshow(rgb)
plt.show()


OpenCV のグレースケール画像を表示する場合

OpenCV のグレースケール画像を matplotlib で表示した場合、以下のように色がおかしくなってしまう。
これは、matplotlib の imshow() がデフォルトでは画像をカラー画像として解釈するためである。

color = cv2.imread('apple.jpg')
plt.imshow(color)
plt.show()

cm 引数 (color map の略) に plt.cm.gray を指定すると、グレースケール画像として解釈される。

plt.imshow(gray, plt.cm.gray)
plt.show()


関数化する

以下のヘルパー関数を作っておくと便利かもしれない。

def show_image(img):
    if img.ndim == 3:  # カラー画像の場合
        rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        plt.imshow(rgb)
    elif img.ndim == 2:  # グレースケール画像の場合
        plt.imshow(img, cmap=plt.cm.gray)
    plt.show()

show_image(color)