numpy
数组会导致这种情况,但不知道原因。我已经阅读了PIL图像的文档,但没有看到任何合理的解释来说明这种情况发生的原因。import numpy as np
from PIL import Image
def _remove_colormap(filename):
return np.array(Image.open(filename))
def _save_annotation(annotation, filename):
pil_image = Image.fromarray(annotation.astype(dtype=np.uint8))
pil_image.save(filename)
def main():
raw_annotation = _remove_colormap('2007_000032.png')
_save_annotation(raw_annotation, '2007_000032_output.png')
if __name__ == '__main__':
main()
输入图像为,
这是输出结果,
注意: 输入图像中红色区域的值为[128,0,0],而在输出图像中为[1,1,1]。
代码的实际来源在这里。
编辑:如@taras在他的评论中所明确的那样,
基本上,调色板是一个由256个红色值、256个绿色值和256个蓝色值组成的3 * 256值列表。您的PIL图像是一个灰度像素数组,每个像素取0..255范围内的单个值。当使用'P'模式时,像素值k被映射到颜色(调色板[k],调色板[256 + k],调色板[2*256 + k])。当使用'L'模式时,颜色就是k或(k,k,k)的RGB值。
分割图像注释为每种对象类型使用唯一的颜色。因此,我们不需要实际的颜色调色板来进行可视化,我们可以摆脱不必要的颜色调色板。