imshowで画像の表示&便利な使い方【matplotlib】

matplotlib

imshowの使い方についてまとめました。
imshowは画像の表示細かいオプションの設定までできる便利な関数です。

また、全てのオプションまではやりませんが、便利なオプションを紹介しているので、透明度の追加上下反転アスペクト比の変更などのいろいろなことが実現できるようになります。

imshowで画像を表示

最も基本的な画像の表示をやってみます。
imshowは表示する画像のデータとして、第一引数に、配列PILイメージを受け取ることができます。

PILイメージから画像を表示

PILイメージを扱うには、別途にfrom PIL import Imageでimportする必要があります。
ちなみにPILはpip install Pillowでインストールができるが、importとinstallで名前が違うので注意

Image.open()によって画像をPILのオブジェクトにしたので、それを単にplt.imshow()に渡すだけで、画像を表示することができる。

import matplotlib.pyplot as plt
from PIL import Image

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

plt.imshow(img)
plt.show()

配列から画像を表示

配列と言っても、具体的には3種類あり、

H:height
W:widthとすると

  1. (H,W) : スカラデータ
  2. (H,W,3) : RGB
  3. (H,W,4) : RGBA

がある。

どの形状でも表示可能

PILの画像オブジェクトを配列にするなら、numpyのasarray()が便利なのでオススメ

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

img = Image.open("hamster.jpg")
img_array = np.asarray(img)
plt.imshow(img_array)
plt.show()

cmapを使ってみる

例えば、モノクロ画像を表示したいと思ったときは単に(Height,Width)の形状の配列等を与えるだけではダメで、cmapを変更する必要がある。

cmapというのはcolor mapのことで、表示する色の組み合わせのことです。

imshowではcmapがデフォルトで、'viridis'となっていることで、(Height,Width)の形状の配列を与えるだけではうまくモノクロ画像を表示することが出来ません。

そこでcmapを'gray'に変えることでモノクロ画像(グレースケール)を表示することができるようになります。

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

img = Image.open("hamster.jpg")
img_array = np.asarray(img)
img_array = img_array[:,:,0]
plt.imshow(img_array,cmap='gray')
plt.show()

他にも様々なcmapがあるので、以下を参照してください!

Choosing Colormaps in Matplotlib — Matplotlib 3.4.1 documentation

アスペクト比を変更する

ピクセル単位のアスペクト比を設定

画像のアスペクト比を変更したいというときもあるでしょう。

その時は、aspect引数が使えるかもしれません。
ここで注意してほしいのは、aspect引数は画像全体のアスペクト比を設定するのではなく、ピクセルのアスペクト比を調整する引数であるということです。

画像全体のアスペクト比を目標にして、aspect引数を利用するなら少し工夫が必要で、後ほどやり方を紹介します。

まずはピクセルのアスペクト比を設定してみましょう。

import matplotlib.pyplot as plt
import numpy as np

img_data = np.linspace(0,1,9)
img_data = img_data.reshape(3,3)
plt.imshow(img_data, aspect=2)
plt.show()

ピクセルのアスペクト比を設定することで画像のアスペクト比を設定

画像全体のアスペクト比を設定するには少し工夫が必要です。

具体的には(1/元の画像のアスペクト比)*やりたいアスペクト比aspect引数に与えます。
(アスペクト比は縦/横で考えることとする)

考え方としては、

  1. 画像を正方形にする(1/元の画像のアスペクト比で実現)
  2. 目的のアスペクト比をかける(やりたいアスペクト比をかけることで実現)

です。

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

img = Image.open('hamster.jpg')
#元の画像サイズを取得
img_size = img.size
#縦/横の比を計算
original_img_aspect = img_size[1] / img_size[0]
#目的の画像アスペクト比(縦/横)
target_aspect = 2
#ピクセルのアスペクト比を(1/original_img_aspect)*target_aspectにする
plt.imshow(img,aspect=(1/original_img_aspect)*target_aspect)
plt.show()

透明度を設定する

画像のデータ自体にαチャネルがある場合もありますが、RGBデータしかない場合は、imshowのalpha引数から透明度を設定することができます。

そもそもαチャネルが存在している配列の場合は、ピクセルごとに設定する必要があるので、配列と同じ形状の配列をalpha引数に渡す必要があるようです。

import matplotlib.pyplot as plt
from PIL import Image

img = Image.open('hamster.jpg')
plt.imshow(img, alpha=0.5)
plt.show()

origin引数で上下を反転

original引数には'upper' or 'lower'を与えることが出来ます。
デフォルトは'upper'です。

配列の[0,0]を
'upper'の時は左上隅から配置し、
'lower'の時は左下隅から配置してくれます。

つまり'lower'を与えると上下が反転する。

import matplotlib.pyplot as plt
from PIL import Image

img = Image.open('hamster.jpg')
plt.imshow(img, alpha=0.5)
plt.show()

extent引数で表示する場所を明示

extent引数を設定することで、画像が塗りつぶす範囲を明示することが出来ます。

引数への与え方は (left, right, bottom, top)です。

塗りつぶす範囲の決め方によってアスペクト比も変化するので、注意しましょう。

import matplotlib.pyplot as plt
from PIL import Image

img = Image.open('hamster.jpg')
plt.imshow(img, extent=(6.5,-0.5,5.5,-0.5))
plt.show()

コメント

タイトルとURLをコピーしました