【问题标题】:Correctly Load Binary Mask/GIF with PIL and Imageio使用 PIL 和 Imageio 正确加载二进制掩码/GIF
【发布时间】:2021-04-13 15:11:08
【问题描述】:

我必须在 Python 中加载一个包含二进制掩码的 gif。

import numpy as np

from PIL import Image
import imageio

from matplotlib import pyplot as plt


maskPIL = np.array(Image.open('mask.gif'))


maskIO = np.array(imageio.imread('mask.gif'))


plt.subplot(1,2,1)
plt.title('PIL Mask')
plt.imshow(maskPIL,cmap='Greys')


plt.subplot(1,2,2)
plt.title('ImageIO Mask')
plt.imshow(maskIO,cmap='Greys')

plt.show()

为什么这两种方法的行为不同?

PIL 版本:8.0.1

imageio 版本:2.9.0

【问题讨论】:

  • 为什么他们的行为不同?因为它们是完全不同的实现。除此之外,尝试使用 RGB PNG 而不是调色板 GIF?

标签: python numpy python-imaging-library python-imageio


【解决方案1】:

如果你这样做:

im = Image.open('mask.gif')
print(im)

输出

<PIL.GifImagePlugin.GifImageFile image mode=P size=683x512 at 0x7FC0C86FF430>

您会看到您的图像是一个调色板图像 - 因为mode=P。这意味着图像中的值不是 RGB 或灰度值,而是调色板的索引。如果你看调色板:

np.array(im.getpalette()).reshape(256,3)
Out[25]: 
array([[255, 255, 255],      <--- palette entry 0
       [  0,   0,   0],      <--- palette entry 1
       [  2,   2,   2],
       [  3,   3,   3],
       [  4,   4,   4],
       [  5,   5,   5],
       ...
       ...

您会看到条目 0 是 rgb(255,255,255),这意味着无论您的图像中有零,它都应该显示为白色!并且无论您在图像中的哪个位置,它都应该显示为黑色。

如果您想要正确的值,如灰度,您需要将图像转换为L 模式,那么您的所有像素都将是实际的灰度值:

maskPIL = np.array(Image.open('mask.gif').convert('L'))

更全面的解释here

【讨论】:

    猜你喜欢
    • 2020-04-13
    • 1970-01-01
    • 2018-07-21
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2013-08-09
    相关资源
    最近更新 更多