HOWTO · Matplotlib

Python Matplotlib で画像を表示する方法

Matplotlib の imshow() でローカル画像を読み込んで表示する方法、PIL 画像を表示する方法、その外観をカスタマイズする方法、図を保存する方法を学びます。

このページの内容

画像を読み込むには matplotlib.pyplot.imread() を、そのピクセルを Matplotlib の軸に配置するには imshow() を、スクリプトで図を表示するには show() を使用します。imread() に渡すパスは、Python プロセスが利用できる画像を指していなければなりません。ノートブックでは最終的な図が自動的に表示されることがよくあります。通常のスクリプトでは plt.show() を呼び出してください。

Matplotlib で画像を読み込んで表示する

この自己完結型の例では、小さなサンプル画像を作成し、imread() で読み取り、表示します。自分のファイルでは、サンプル画像のセットアップと image_path の代入を、Python プロセスがアクセスできる画像へのパスに置き換えてください。画像をスクリプトの横に置いてそのファイル名を使用するか、絶対パスを指定します。相対パスはプロセスの現在の作業ディレクトリから解決されます。

from pathlib import Path
from tempfile import TemporaryDirectory

import matplotlib.pyplot as plt
import numpy as np

with TemporaryDirectory() as directory:
    image_path = Path(directory) / "sample.png"
    pixels = np.zeros((3, 3, 3), dtype=float)
    pixels[:, :, 0] = 1.0
    plt.imsave(image_path, pixels)

    image = plt.imread(image_path)
    plt.imshow(image)
    plt.axis("off")
    plt.show()
    print("Image loaded and displayed.")
Image loaded and displayed.

imread() はファイルを配列に読み込み、imshow() は matplotlib.pyplot の関数で、その画像データを現在の軸に表示します。axis("off") は軸とその目盛りを非表示にします。生成されたサンプルは、この実行可能な例のためのフィクスチャにすぎません。自分の画像を使用する場合は、そのファイルを選択したパスで利用できるようにし、直接読み取ってください。

Matplotlib Python で画像を表示する

Matplotlib で PIL 画像を表示する

画像がすでに PIL 画像オブジェクトで表されている場合は、plt.imread() で読み取る代わりに、そのオブジェクトを imshow() に渡します。これは、プログラムの別の部分がすでに Pillow で画像を開いたり処理したりしている場合に便利です。Image.show() は別の PIL 表示経路です。Matplotlib の図を表示するには plt.show() を使用してください。2 つの表示呼び出しは異なるレンダリング経路を使用するので、軸、図のサイズ指定、図のエクスポートが必要な場合は Matplotlib の経路を使用してください。

from pathlib import Path
from tempfile import TemporaryDirectory

import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

with TemporaryDirectory() as directory:
    image_path = Path(directory) / "sample.png"
    plt.imsave(image_path, np.full((3, 3, 3), 0.4))

    with Image.open(image_path) as image:
        plt.imshow(image)
        plt.axis("off")
        plt.show()

ローカルファイルを開くには、一時的なサンプルパスを自分の画像パスに置き換えてください。この経路には、PIL.Image を提供する Pillow が必要です。

Matplotlib Python PIL で画像を表示する

画像の表示をカスタマイズする

RGB データをグレースケールで表示するには、その 3 つのカラーチャンネルを平均し、グレースケールのカラーマップを選択します。以下の mean(axis=2) 演算は、配列の 3 番目の軸に赤、緑、青のチャンネルが含まれていることを前提としています。すべての画像形状やカラーモデルに適しているわけではありません。補間は、Matplotlib が画面上にピクセルをレンダリングする方法を変更するものであり、ソース画像の詳細を変更するものではありません。

import matplotlib.pyplot as plt
import numpy as np

image = np.array(
    [
        [[1.0, 0.2, 0.1], [0.2, 0.8, 0.3]],
        [[0.1, 0.3, 1.0], [0.8, 0.8, 0.8]],
    ]
)
plt.imshow(image.mean(axis=2), cmap="gray", interpolation="bicubic")
plt.axis("off")
plt.show()

cmap="gray" は平均化された値をグレーの色調に対応付けます。画像やその表示方法により適している場合は、サポートされている別のカラーマップや補間設定を選択してください。カラー画像を保持するには、平均化された配列ではなく元の配列を imshow() に渡します。表示オプションはレンダリングされた表示に影響します。読み込まれたピクセルデータを書き換えることはありません。

Matplotlib Python でグレースケール画像を表示する

表示した図を保存する

Matplotlib の図を画像ファイルに書き出すには savefig() を使用します。これは元の画像を変更するのではなく、軸とレイアウトを含む図を保存します。表示バックエンドを問わず保存操作で図を利用できるように、show() を呼び出す前に保存してください。

import matplotlib.pyplot as plt
import numpy as np

image = np.full((3, 3, 3), 0.4)
plt.imshow(image)
plt.axis("off")
plt.savefig("displayed-image.png", bbox_inches="tight", pad_inches=0)
plt.show()

パス displayed-image.png は現在の作業ディレクトリからの相対パスで書き込まれます。図を保存する場所を制御するには、別のファイル名やパスを選択してください。タイトな切り抜きには、bbox_inches="tight" が周囲の空白を取り除き、pad_inches=0 が余分な余白を取り除きます。エクスポートされる寸法が重要な場合は、プロットする前に図のサイズを設定してください。保存されたファイルは現在の Matplotlib の図のレンダリングです。