使用 PIL 和 Imageio 正确加载二进制 Mask/GIF
Correctly Load Binary Mask/GIF with PIL and Imageio
我必须在 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
如果你这样做:
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'))
更详细的解释 。
我必须在 Python.
中加载包含二进制掩码的 gifimport 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
如果你这样做:
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'))
更详细的解释