【发布时间】:2019-01-13 02:53:45
【问题描述】:
在下面的代码中,我只看到,一个图像被再次读取和写入。但是图像像素值如何发生如此剧烈的变化?显然,将 PIL 图像对象转换为 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]。
代码的实际来源是here。
编辑: 正如@taras 在他的评论中明确指出的那样,
基本上,调色板是 3 * 256 个值的列表,形式为 256 个红色值, 256 个绿色值和 256 个蓝色值。你的 pil_image 是一个数组 每个灰度像素在 0..255 范围内取单个值。什么时候 使用 'P' 模式,像素值 k 被映射到颜色(pallette[k], 调色板[256 + k],调色板[2 * 256 + k])。使用“L”模式时,颜色 只是 RGB 中的 k 或 (k, k, k)
分割图像注释为每个对象类型使用唯一的颜色。所以我们不需要实际的调色板来进行可视化,我们去掉了不必要的调色板。
【问题讨论】:
-
它与“P”(8 位像素,使用调色板映射到任何其他模式)模式有关。当您编写输出图像时,此信息会丢失,而您会得到灰度图像。
-
这里已经解释的很透彻了...stackoverflow.com/a/51677796/2836621
标签: python image-processing python-imaging-library