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とすると
- (H,W) : スカラデータ
- (H,W,3) : RGB
- (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があるので、以下を参照してください!
アスペクト比を変更する
ピクセル単位のアスペクト比を設定
画像のアスペクト比を変更したいというときもあるでしょう。
その時は、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/元の画像のアスペクト比
で実現) - 目的のアスペクト比をかける(
やりたいアスペクト比
をかけることで実現)
です。
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引数で上下を反転
origin
引数には'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, origin='lower')
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()

コメント
origin引数で上下を反転のpythonのコードにorigin引数がないですよ
(分かりやすい解説ですありがとうございます!)
ご指摘ありがとうございます!
修正いたしました!