Warning: Undefined variable $position in /home/pystyles/pystyle.info/public_html/wp/wp-content/themes/lionblog/functions.php on line 4897

matplotlib – OpenCV の画像を matplotlib で表示する方法

matplotlib – OpenCV の画像を matplotlib で表示する方法

概要

OpenCV の cv2.imread() で読み込んだ ndarray 形式の画像を matplotlib の Axes.imshow() で表示する際の注意点について解説します。

Advertisement

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

OpenCV の cv2.imread() で読み込んだカラー画像を matplotlib の Axes.imshow() で表示した場合、以下のように色が反転します。 これは、OpenCV の cv2.imread() で読み込んだ画像はチャンネル順が BGR であるのに対し、matplotlib の Axes.imshow() で表示する際に画像のチャンネル順を RGB として扱うのが原因です。

sample.jpg

In [1]:
import cv2
import matplotlib.pyplot as plt

img = cv2.imread("sample.jpg")

fig, ax = plt.subplots()
ax.imshow(img)
plt.show()

正しい色で表示するためには、表示する前に cv2.cvtColor(img, cv2.COLOR_BGR2RGB) でチャンネル順を BGR から RGB に変換します。

In [2]:
img = cv2.imread("sample.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

fig, ax = plt.subplots()
ax.imshow(img)
plt.show()

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

OpenCV の cv2.imread() で読み込んだグレースケール画像を matplotlib の Axes.imshow() で表示した場合、以下のようになります。 これは、matplotlib の Axes.imshow() では、2次元の numpy 配列を渡した場合、画像ではなくデータとして解釈し、カラーマップを適用して描画するのが原因です。

In [3]:
img = cv2.imread("sample.jpg", cv2.IMREAD_GRAYSCALE)

fig, ax = plt.subplots()
ax.imshow(img)
plt.show()

正しい色で表示するためには、Axes.imshow() を呼び出す際にカラーマップ cmap="gray" を指定します。 また、カラーマップの範囲の下限、上限を vmin=0, vmax=255 で指定します。

In [4]:
fig, ax = plt.subplots()
ax.imshow(img, cmap="gray", vmin=0, vmax=255)
plt.show()