matplotlibライブラリは不可欠なツールです。特にmatplotlib.pyplotモジュールは、画像の描画と表示に中心的な役割を果たします。imshow()関数による画像描画
画像の描画は、matplotlib.pyplot.imshow()関数を用いて行います。この関数は、指定された画像データ(NumPy配列など)をRGB(A)カラー空間で描画するのが基本ですが、cmap引数でカラーマップを指定することで、様々な色調で表示できます。
imshow()関数の基本的な構文は以下の通りです。
matplotlib.pyplot.imshow(X, cmap=None)
X: 描画する画像データまたは配列。cmap: カラーマップを指定します。指定しない場合は、デフォルトのRGB(A)カラー空間が使用されます。
利用可能なカラーマップの例:
autumn: 赤からオレンジ、黄色へbone: 黒から白(X線画像風)gray: 黒から白へのグレースケールhot: 黒から赤、黄色、白へjet: 青からシアン、黄色、赤へviridis: 青から緑、黄色へ
例えば、グレースケールで表示するにはcmap=plt.cm.grayのように指定します。
import matplotlib.pyplot as plt
from skimage import io, data
# 画像データの読み込み (例: skimageのastronaut画像)
img = data.astronaut()
# 画像の描画
plt.imshow(img)
plt.show() # ウィンドウに画像を表示
# グレースケールで描画
plt.imshow(img, cmap=plt.cm.gray)
plt.show()
imshow()関数は、描画された画像を表すAxesImageオブジェクトを返します。描画されたウィンドウを表示するには、通常plt.show()関数を呼び出します。ただし、IPythonなどのインタラクティブ環境では、plt.show()を省略しても自動的に表示される場合があります。
figure()とsubplot()による複数画像の表示
matplotlibでは、plt.figure()で描画ウィンドウ(Figure)を作成し、plt.subplot()でそのウィンドウ内に複数の描画領域(Axes)を作成して、それぞれに異なる画像を表示できます。
from skimage import data
import matplotlib.pyplot as plt
img = data.astronaut()
# 'astronaut'という名前で、サイズ8x8インチのウィンドウを作成
plt.figure(num='astronaut', figsize=(8, 8))
# ウィンドウを2x2のグリッドに分割し、1番目のサブプロットを選択
plt.subplot(2, 2, 1)
plt.title('Original Image')
plt.imshow(img)
# 2番目のサブプロットを選択 (RGBのRチャンネルをグレースケールで表示)
plt.subplot(2, 2, 2)
plt.title('R Channel')
plt.imshow(img[:, :, 0], cmap=plt.cm.gray)
plt.axis('off') # 座標軸を非表示
# 3番目のサブプロットを選択 (Gチャンネル)
plt.subplot(2, 2, 3)
plt.title('G Channel')
plt.imshow(img[:, :, 1], cmap=plt.cm.gray)
plt.axis('off')
# 4番目のサブプロットを選択 (Bチャンネル)
plt.subplot(2, 2, 4)
plt.title('B Channel')
plt.imshow(img[:, :, 2], cmap=plt.cm.gray)
plt.axis('off')
# 全てのサブプロットを表示
plt.show()
plt.figure()関数は、描画ウィンドウの作成や設定に使用されます。主な引数:
num: ウィンドウのタイトルまたは番号。figsize: ウィンドウのサイズをインチ単位で指定(幅, 高さ)。dpi: 解像度。facecolor: 背景色。
plt.subplot(nrows, ncols, plot_number)は、ウィンドウをnrows行ncols列に分割し、plot_number番目のサブプロットを選択します。例えばplt.subplot(2, 2, 1)は2行2列のグリッドの1番目を選択します。plt.subplot(221)のように数字を連結して指定することも可能です。
サブプロットのタイトルはplt.title()、座標軸の表示・非表示はplt.axis('off')またはplt.axis('on')で制御できます。
subplots()によるウィンドウとサブプロットの同時作成
plt.subplots()関数は、描画ウィンドウ(Figure)とサブプロット(Axes)の配列を一度に作成するための、よりオブジェクト指向的な方法を提供します。
import matplotlib.pyplot as plt
from skimage import data, color
# skimageの提供する画像データを読み込み、HSV色空間に変換
img_rgb = data.immunohistochemistry()
img_hsv = color.rgb2hsv(img_rgb)
# 2x2のサブプロットを持つウィンドウを作成
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(7, 6))
# Axesオブジェクトの配列を1次元に展開
ax0, ax1, ax2, ax3 = axes.ravel()
# 各サブプロットに画像を描画し、タイトルを設定
ax0.imshow(img_rgb)
ax0.set_title("Original Image")
ax1.imshow(img_hsv[:, :, 0], cmap=plt.cm.gray)
ax1.set_title("H Channel")
ax2.imshow(img_hsv[:, :, 1], cmap=plt.cm.gray)
ax2.set_title("S Channel")
ax3.imshow(img_hsv[:, :, 2], cmap=plt.cm.gray)
ax3.set_title("V Channel")
# 全てのサブプロットで座標軸を非表示
for ax in axes.flat: # axes.flat は axes.ravel() と同様に1次元イテレータを返す
ax.axis('off')
# サブプロット間のレイアウトを自動調整
fig.tight_layout()
plt.show()
plt.subplots(nrows=1, ncols=1)は、指定された行数と列数でサブプロットを持つFigureオブジェクトと、それらのAxesオブジェクトの配列を返します。返されたAxes配列はravel()メソッドやflat属性を使って一次元化し、個々のサブプロットにアクセスしやすくします。各サブプロットへの描画やタイトル設定は、返されたAxesオブジェクトのメソッド(例: ax.imshow(), ax.set_title())を使用して行います。
fig.tight_layout()は、サブプロット間の間隔やパディングを自動的に調整し、タイトルやラベルが重ならないようにレイアウトを最適化します。
skimage.viewerによる画像表示
scikit-imageライブラリには、skimage.viewerモジュールがあり、Qtフレームワークを利用して画像を表示する簡易的なビューア機能を提供します。
from skimage import data
from skimage.viewer import ImageViewer
img = data.coins()
viewer = ImageViewer(img)
viewer.show()
この方法は、複雑なレイアウト設定なしに手軽に画像を表示したい場合に便利です。
まとめ
Pythonで画像を扱い、描画・表示する際の主要な関数を以下にまとめます。
| 関数名 | 機能 | 主な呼び出し形式 |
|---|---|---|
plt.figure() |
描画ウィンドウ(Figure)を作成 | plt.figure(num=1, figsize=(8, 8)) |
plt.imshow() |
画像を描画 | plt.imshow(image, cmap=plt.cm.gray) |
plt.show() |
作成されたウィンドウを表示 | plt.show() |
plt.subplot() |
Figure内にサブプロット(Axes)を作成・選択 | plt.subplot(2, 2, 1) |
plt.title() |
サブプロットのタイトルを設定 (subplotと併用) |
plt.title('Title') |
plt.axis() |
座標軸の表示/非表示を設定 | plt.axis('off') |
plt.subplots() |
Figureと複数のサブプロット(Axes)を同時に作成 | fig, axes = plt.subplots(2, 2, figsize=(8, 8)) |
axes.ravel() / axes.flat |
Axes配列を一次元化 | ax0, ax1 = axes.ravel() |
ax.set_title() |
サブプロットのタイトルを設定 (subplotsと併用) |
ax0.set_title('Title') |
fig.tight_layout() |
サブプロットのレイアウトを自動調整 | fig.tight_layout() |