[Python]imshowメソッドで画像表示するには型を気にしようという話

あなたの画像を表示するには画像データを格納している変数の型に気をつけましょうというお話です。
2022.07.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

皆さん、こんにちは。hotoke_nekoです。

今回は画像表示する時に気をつけようというお話を書いていきます。 なお、今回お話しする内容はpng画像を元にコードの確認をしています。

あなたのその画像は何の型ですか?

先に結論

型が違うと、データの並び順が違います。 そのため、imshowメソッドで表示するには型を変換するなど工夫が必要です。

型が違うということ

ai_character

今回は上記の画像を元に確認をしていきます。

画像関連で使える型

型として使えるものには次のものがあります。

  • Pillow(以下、PIL)
  • torch.Tensor(以下、torch)
  • numpy.ndarray(以下、ndarray)

上記以外でも、array-likeのものであれば表示できると公式では書かれています。

コード上で確認

次のコードでPillow(以下、PIL)、torch.Tensor、numpy.ndarrayを用意しました。

from PIL import Image
import torchvision
import numpy as np


image_PIL = Image.open(<ここに画像までのファイルパスを入れてください>)
image_torch = torchvision.transforms.functional.to_tensor(image_PIL)
image_nparray=np.array(image_PIL)

それぞれの型におけるデータのshapeは次のようになります。

check each types shape

画像を出力するには?

次のリンクが公式ドキュメントです。

こちらを確認したところ、(幅、高さ)の順番のデータを渡し、RGBやRGBAの場合は、高さの後にデータを格納した形で渡すようにと書かれていました。つまり順番として、(幅、高さ、色)の順番のデータです。

※色のデータには、RGBやRGBAなどがあります。

実際に出力して確認します。

PIL型の画像表示

PIL型の場合は、imshowメソッドに変数をそのまま渡すと表示できます。 imshow

torch型の画像表示

torch型のshapeでは(色、幅、高さ)の順番でデータを持っているため、データの並び順を変更して(幅、高さ、色)にする必要があります。

今回はpermuteメソッドを使って並び順を整えました。

ndarray型の画像表示

データの並び順が(幅、高さ、色)となっているため、PIL型と同じくそのままimshowメソッドへ変数を渡すと表示できます。

終わりに

今回は型の違いによって工夫が必要となる可能性があるimshowメソッドでの画像表示についてお伝えしました。

機械学習で画像処理を行うと、torch型で画像データを出力されるものもあるため、型を変換するか、データの並び順を変更する必要があります。

型を考えるためにも、その画像がどのような型であるのかをtypeメソッドを使って確認していくクセをつけていったほうが良いかもしれませんね。

それでは、また!