Pynote

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

matplotlib - imshow で画像や配列を表示する方法

公式リファレンス

API

サンプル

画像または2次元配列を表示する。 (imshow)

pyplot.imshow(X, cmap=None, norm=None, aspect=None, interpolation=None,
              alpha=None, vmin=None, vmax=None, origin=None, extent=None,
              shape=None, filternorm=1, filterrad=4.0, imlim=None,
              resample=None, url=None, *, data=None, **kwargs)

次の形状の配列に対応している。

  • (M, N): カラーマップで表示する。
  • (M, N, 3): RGB 値として解釈し、表示する。
  • (M, N, 4): RGBA 値として解釈し、表示する。

(M, N, 3) または (M, N, 4) の場合、各画素は [0, 1] の float または [0, 255] の int でなければならない。
範囲外の値はこの範囲にクリップした上で表示される。

グレースケール画像

入力画像

カラーマップで gray を指定する。

import cv2
import matplotlib.pyplot as plt

# グレースケール形式で読み込む。
img = cv2.imread("sample.jpg", cv2.IMREAD_GRAYSCALE)
print(img.shape)  # (318, 425)

fig, ax = plt.subplots()
ax.imshow(img, cmap="gray")

plt.show()


RGB 画像

入力画像

import matplotlib.pyplot as plt

img = plt.imread("rgba.png", cv2.IMREAD_UNCHANGED)
print(img.shape)  # (330, 440, 4)

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

plt.show()


OpenCV の画像

OpenCV の cv2.imread() で読み込んだ画像はチャンネルの順番が BGR なので、imshow で表示する前に RGB に変換する必要がある。

import cv2
import matplotlib.pyplot as plt

bgr = cv2.imread("sample.jpg")
rgb = cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)

fig, ax = plt.subplots(facecolor="w")
ax.imshow(rgb)

plt.show()

http://pynote.hatenablog.com/entry/matplotlib-show-cv-imagepynote.hatenablog.com

PIL (pillow) の画像

PIL.Image の画像も対応している。

import matplotlib.pyplot as plt
from PIL import Image

img = Image.open("sample.jpg")

fig, ax = plt.subplots(facecolor="w")
ax.imshow(img)

plt.show()

RGBA 画像

使用した画像

import matplotlib.pyplot as plt

img = plt.imread("rgba.png")
print(img.shape)  # (330, 440, 4)

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

plt.show()


配列を表示する。

(M, N) の配列を渡した場合は、カラーマップで描画される。

import matplotlib.pyplot as plt
import numpy as np

img = np.random.rand(10, 10)

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

plt.show()


カラーマップを設定する。

import matplotlib.pyplot as plt
import numpy as np

mat = np.random.rand(10, 10)

fig, ax = plt.subplots()
ax.imshow(mat, cmap="magma")

plt.show()


アスペクト比を設定する。

import matplotlib.pyplot as plt
import numpy as np

mat = np.random.rand(10, 15)

fig = plt.figure(figsize=(8, 8), facecolor="w")

params = [0.5, 2, "auto", "equal"]
for i, p in enumerate(params, 1):
    ax = fig.add_subplot(2, 2, i)
    ax.imshow(mat, aspect=p)
    # タイトルを設定する。
    s = "'{}'".format(p) if isinstance(p, str) else p
    ax.set_title(f"aspect={s}")

plt.show()


補完方式を設定する。

import matplotlib.pyplot as plt
import numpy as np

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

params = [
    "none",
    "nearest",
    "bilinear",
    "bicubic",
    "spline16",
    "spline36",
    "hanning",
    "hamming",
    "hermite",
    "kaiser",
    "quadric",
    "catrom",
    "gaussian",
    "bessel",
    "mitchell",
    "sinc",
    "lanczos",
]

fig = plt.figure(figsize=(12, 20), facecolor="w")
for i, p in enumerate(params, 1):
    ax = fig.add_subplot(6, 3, i)
    ax.imshow(img, interpolation=p)
    ax.set_axis_off()
    # タイトルを設定する。
    s = "'{}'".format(p) if isinstance(p, str) else p
    ax.set_title(f"interpolation={s}")

plt.show()


透過度を設定する。

import matplotlib.pyplot as plt

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

fig, ax = plt.subplots(facecolor="w")
ax.imshow(img, alpha=0.5)

plt.show()


座標系を設定する。

  • 'upper': 左上原点で +x が右、+y が下の画像座標系
  • 'lower': 左下原点で +x が右、+y が上の標準座標系
import matplotlib.pyplot as plt

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

fig = plt.figure(figsize=(8, 5))
for i, p in enumerate(["upper", "lower"], 1):
    ax = fig.add_subplot(1, 2, i)
    ax.imshow(img, origin=p)
    # タイトルを設定する。
    s = "'{}'".format(p) if isinstance(p, str) else p
    ax.set_title(f"origin={s}")

plt.show()


2次元配列を表示する。 (matshow)

2次元配列の描画に特化した imshow のパラメータを以下のようにした関数である。

  • origin='upper'
  • interpolation='nearest'
  • aspect='equal'
  • x 軸、y 軸の目盛りはそれぞれ左と上に配置される。
  • x 軸、y 軸の目盛りのラベルは整数で設定される。
import matplotlib.pyplot as plt
import numpy as np

mat = np.random.rand(10, 10)

fig, ax = plt.subplots(facecolor="w")
ax.matshow(mat)

plt.show()