Pythonで画像処理をしていると、画像データの型(クラス)は、OpenCVを使っているとNumPyだし、Tkinterで画像を表示しようとすると、Pillowを使ったりもするので、どうしても画像データがNumPyとPillowが混在しがちです。
そこで、画像データがNumPyなのか?Pillowなのか?を調べる方法の紹介です。
画像データに限らず、インスタンスしたクラスのオブジェクトが、どのクラスなのかを調べるにはisinstance関数を用います。
ininstance関数の書式は以下の通りです。
ininstance(クラスオブジェクト, クラス)
クラスオブジェクトが指定したクラスと一致している場合はTrueが、異なる場合はFalseが返ります。
このininstance関数を使って、画像データがNumPyなのか?Pillowなのか?を調べる関数の例を以下に示します。
def check_image_data(image):
'''画像データがNumPyか、Pillowかを調べる'''
if isinstance(image, np.ndarray):
print("NumPy Image")
elif isinstance(image, Image.Image):
print("Pillow Image")
この関数を使って、実際に画像データがNumPyかPillowかを調べるサンプルは以下の通りです。
from PIL import Image
import numpy as np
def check_image_data(image):
'''画像データがNumPyか、Pillowかを調べる'''
if isinstance(image, np.ndarray):
print("NumPy Image")
elif isinstance(image, Image.Image):
print("Pillow Image")
# Pillowの画像データ
pillow_image = Image.open("Mandrill.bmp")
check_image_data(pillow_image)
# NumPyの画像データ
numpy_image = np.asarray(pillow_image)
check_image_data(numpy_image)
実行結果
型を調べるだけならtype関数を使うこともできます。
(例)
print(type(numpy_image))
# <class 'numpy.ndarray'>
print(type(pillow_image))
# <class 'PIL.BmpImagePlugin.BmpImageFile'>
上記のコメント部分がtype関数を使って型を表示した結果になりますが、NumPyの型は‘numpy.ndarray’と表示されているので、まだ分かり易いのですが、Pillowの型は、’PIL.Image.Image’と表示されるのを期待しているのですが、‘PIL.BmpImagePlugin.BmpImageFile’と表示されてしまいます。
これは、bmpファイルからPillowの画像データを開いたためで、別のjpegファイルから開くと別の型が表示されます。
そのため、型を調べる、表示するだけなら type関数、型を判断するならisinstance関数という使い分けが良さそうです。