Pynote

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

matplotlib - 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('sample.jpg')
print(img.shape)  # (318, 425, 3)

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

plt.show()

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

pynote.hatenablog.com

RGBA 画像


使用した画像

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()


配列を表示する。

(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

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

fig, ax = plt.subplots()
ax.imshow(img, cmap='magma')

plt.show()


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

import matplotlib.pyplot as plt
import numpy as np

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

fig = plt.figure(figsize=(8, 8))
params = [0.5, 2, 'auto', 'equal']
for i, p in enumerate(params, 1):
    ax = fig.add_subplot(2, 2, i)
    ax.imshow(img, aspect=p)
    # タイトルを設定する。
    s = "'{}'".format(p) if isinstance(p, str) else p
    ax.set_title("aspect={}".format(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))
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("interpolation={}".format(s))

plt.show()


透過度を設定する。

import matplotlib.pyplot as plt

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

fig, ax = plt.subplots()
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))
params = ['upper', 'lower']
for i, p in enumerate(params, 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("origin={}".format(s))

plt.show()