区分 PIL 和 CV2 图像

Differentiating between a PIL and CV2 image

我想使用 TF 模型,但图像预处理需要 PIL 图像。我希望我的程序能够接受 PIL 和 CV2 图像。我知道如何将 CV2 图像转换为 PIL 图像,但我不知道如何区分它们以了解何时应用转换。 所以我需要这样的条件:

if image is PIL.Image:
    ...
elif image is CV2.Image:
   conversion
   ...

有人有方法吗?

当您使用 CV2 打开图像时,它 returns 类型为 numpy.ndarray 的对象,但 PIL 的 Image.open() returns PIL.JpegImagePlugin.JpegImageFile。因此,使用它,您基本上可以区分您的案例中使用的是哪种(假设不涉及将一种图像类型转换为另一种图像类型的转换或进一步处理)。

import cv2
from PIL import Image
from PIL import JpegImagePlugin

imgcv = cv2.imread('./koala.jpg')
print(type(imgcv))

imgpil = Image.open('./koala.jpg')
print(type(imgpil))

img = imgpil
if isinstance(img,JpegImagePlugin.JpegImageFile):
    print('PIL Image')
else:
    print('Not PIL')

输出:

<class 'numpy.ndarray'>
<class 'PIL.JpegImagePlugin.JpegImageFile'>
PIL Image

正如在这个答案的评论中提到的(Mark Setchell),我们也可以检查 ndarray 检查然后决定,而不是改变 PIL 的 JpegImageFile class PIL 的 class 将来可能会改变,或者他们可能只是使用不同的类型。不过支票是完全一样的。

img = imgcv
if isinstance(img,numpy.ndarray):
    print('CV Image')
else:
    print('PIL Image')

不要试图区分。只需在读取图像对象后立即对其进行转换,以便您的程序始终处理一致的图像类型。