原始问题中提到的值看起来像“颜色图”值,可以通过模块中的getpalette()
函数获得。PIL Image
对于 VOC 图像的注释值,我使用以下代码片段来检查它们:
import numpy as np
from PIL import Image
files = [
'SegmentationObject/2007_000129.png',
'SegmentationClass/2007_000129.png',
'SegmentationClassRaw/2007_000129.png', # processed by _remove_colormap()
# in captainst's answer...
]
for f in files:
img = Image.open(f)
annotation = np.array(img)
print('\nfile: {}\nanno: {}\nimg info: {}'.format(
f, set(annotation.flatten()), img))
代码中使用的三张图片如下所示(分别从左到右):
代码的对应输出如下:
file: SegmentationObject/2007_000129.png
anno: {0, 1, 2, 3, 4, 5, 6, 255}
img info: <PIL.PngImagePlugin.PngImageFile image mode=P size=334x500 at 0x7F59538B35F8>
file: SegmentationClass/2007_000129.png
anno: {0, 2, 15, 255}
img info: <PIL.PngImagePlugin.PngImageFile image mode=P size=334x500 at 0x7F5930DD5780>
file: SegmentationClassRaw/2007_000129.png
anno: {0, 2, 15, 255}
img info: <PIL.PngImagePlugin.PngImageFile image mode=L size=334x500 at 0x7F5930DD52E8>
我从上面的输出中学到了两件事。
首先, SegmentationObject文件夹中图像的注释值由对象的数量分配。在这种情况下,有 3 个人和 3 辆自行车,注释值是从 1 到 6。但是,对于SegmentationClass文件夹中的图像,它们的值由对象的类值分配。所有的人都属于15级,所有的自行车都是2级。
其次,正如mkisantal已经提到的,在np.array()
操作之后,调色板被移除(我通过观察结果“知道”它,但我仍然不了解引擎盖下的机制......)。我们可以通过检查输出来确认这一点image mode
: