matplotlibでの画像の表示【Python】

matplotlibを用いて画像を表示する方法を解説していきます。
なおOpenCVを用いて画像を読み込み・保存する方法は以下の記事をご覧ください。

[toc]
目次

画像の読み込み

以下の例ではローカルに保存した D:\BioTech-Lab\lena.jpg という画像ファイルを読み込んでみます。

Lena.jpg

pyplot.imread関数を用いて画像をndarrayとして読み込みます。

import matplotlib.pyplot as plt
img = plt.imread(r'D:\BioTech-Lab\lena.jpg')
print(img.shape)
(512, 512, 3)

これにより画像は、以下の形状のndarray形式の配列として読み込まれ、(Y座標, X座標, カラーチャネル)となります。

  • グレースケールの場合は、形状が(M, N)
  • RGB画像の場合は、形状が(M, N, 3)
  • RGBA画像の場合は、形状が(M, N, 4)

OpenCVのimread関数のように明示的にグレースケールやBGRなどと指定する必要はなく、自動的に最適な形状のndarrayに変換されるので便利です。(ただし、実際に使ってみると圧縮TIFFがうまく表示できなかったり、形状の解釈が思うようにいかなかったりと、若干不安定な印象を受けました… )

また、matplotlibでは座標系はOpenCVと同様で左上が原点の座標系となりますが、画素値はOpenCVとは違いRGBで与えられます。

画像の表示

基本コード

画像を表示させる方法はpyplot.imshow関数を用いる方法(pyplot スタイル)とAxes.imshowメソッドを用いる方法(オブジェクト指向スタイル)の2通りがあります。

pyplot スタイル

import matplotlib.pyplot as plt
img = plt.imread(r'D:\BioTech-Lab\Lena.jpg')
plt.imshow(img)
plt.show()

オブジェクト指向スタイル

import matplotlib.pyplot as plt
img = plt.imread(r'D:\BioTech-Lab\Lena.jpg')
fig, ax = plt.subplots()
ax.imshow(img)
plt.show()

これにより以下のように画像を表示させることができます。

グレースケール画像の表示

まずは、先ほどのLena.jpgをグレースケールに変換したファイル(Lena_gray.tiff)をそのまま読み込んでみます。

import matplotlib.pyplot as plt
img = plt.imread(r'D:\BioTech-Lab\Lena_gray.tiff')
plt.imshow(img)
plt.show()

すると上のような結果となり、グレースケールではない画像となってしまいました。これは、単一のカラーチャネルしか含まない画像がpyplot.imshow関数/Axes.imshowメソッドに渡されると、カラーマップに従って画素値が色に変換されるのですが、デフォルトのカラーマップがグレースケールではないことが原因です。

pyplot.imshow関数/Axes.imshowメソッドのcmap引数にグレースケールを表すカラーマップを指定しましょう。組み込みカラーマップはmatplotlib.cmモジュールにグローバル変数として定義されています。ここに定義されているカラーマップの名前を文字列としてcmap引数に指定するか、カラーマップを表すオブジェクトを直接cmap引数に指定することで、カラーマップを指定できます。

cmap引数にカラーマップ名を文字列で指定する

import matplotlib.pyplot as plt
img = plt.imread(r'D:\BioTech-Lab\Lena_gray.tiff')
plt.imshow(img, cmap='gray')
plt.show()

cmap引数にカラーマップオブジェクトで指定する

import matplotlib.pyplot as plt
import matplotlib.cm as cm
img = plt.imread(r'D:\BioTech-Lab\Lena_gray.tiff')
plt.imshow(img, cmap=cm.gray)
plt.show()

カラーマップを指定することで、無事グレースケール画像になりました。

OpenCVで読み込んだ画像の表示

OpenCVではカラーチャネルがBGRの順番であるのに対して、matplotlibではRGBの順番で格納されています。このため、OpenCVで読み込んだ画像をそのままmatplotlibで表示すると色がおかしくなってしまいます。

import matplotlib.pyplot as plt
import cv2
img = cv2.imread(r'D:\BioTech-Lab\Lena.jpg')
plt.imshow(img)
plt.show()

OpenCVで読み込んだ画像のカラーチャネルをBGRからRGBに変換してやりましょう。

import matplotlib.pyplot as plt
import cv2
img = cv2.imread(r'D:\BioTech-Lab\Lena.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()

これで以下のように元の画像が表示されるようになりました。

軸目盛を非表示にする

matplotlibはもともとはグラフ描画用のライブラリなので、画像を表示させても軸目盛がついてしまいます。画像を表示させるだけなら軸は不要なので、次のようにして軸を非表示にできます。

pyplot スタイル

import matplotlib.pyplot as plt
img = plt.imread(r'D:\BioTech-Lab\Lena.jpg')
plt.imshow(img)
plt.axis('off')
plt.show()

オブジェクト指向スタイル

import matplotlib.pyplot as plt
img = plt.imread(r'D:\BioTech-Lab\Lena.jpg')
fig, ax = plt.subplots()
ax.imshow(img)
ax.set_axis_off()
plt.show()

これで以下のように余分な軸を消して、画像だけを表示することができるようになりました。

画像の保存

画像を表すndarrayから画像ファイルに保存するにはpyplot.imsave関数を用います。

import matplotlib.pyplot as plt
img = plt.imread(r'D:\BioTech-Lab\Lena.jpg')
plt.imsave(r'D:\BioTech-Lab\Lena2.png', img)

スポンサーリンク

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

12 + fifteen =

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次