Python Tensorflow Deeplab图像彩色贴图消除混淆
在下面的代码中,我只看到一个图像被再次读写。但是图像像素值是如何发生如此剧烈的变化的?显然,将PIL图像对象转换为Python Tensorflow Deeplab图像彩色贴图消除混淆,python,image-processing,python-imaging-library,Python,Image Processing,Python Imaging Library,在下面的代码中,我只看到一个图像被再次读写。但是图像像素值是如何发生如此剧烈的变化的?显然,将PIL图像对象转换为numpy数组会导致这种情况,但不知道原因。我已经阅读了PIL图像的文档,但没有看到任何合理的解释 import numpy as np from PIL import Image def _remove_colormap(filename): return np.array(Image.open(filename)) def _save_annotation(annot
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在评论中明确指出的那样
基本上,调色板是一个3*256个值的列表,格式为256个红色值, 256个绿色值和256个蓝色值。您的pil_图像是一个 灰度像素,每个像素取0..255范围内的单个值。什么时候 使用“P”模式,将像素值k映射到颜色(托盘[k], 调色板[256+k],调色板[2*256+k])。使用“L”模式时,颜色 在RGB中是简单的k还是(k,k,k)
分割图像注释为每个对象类型使用唯一的颜色。因此,可视化不需要实际的调色板,我们去掉了不必要的调色板。使用
Image.open(filename).mode
显示以'p'
模式打开输入文件
代表什么
8位像素,使用调色板映射到任何其他模式
因此,当您使用image.fromarray
生成图像时,调色板将丢失
在'L'
模式下,您将看到一个灰度图像
创建输出数组时,只需提供调色板信息
可以使用Image.getpalette()
提取调色板:
def _remove_colormap(filename):
img = Image.open(filename)
palette = img.getpalette()
return np.array(img), palette
创建pil_图像后
可以使用image.putplate(调色板)
而您的main
也相应更改:
def main():
raw_annotation, palette = _remove_colormap('SqSbn.png')
_save_annotation(raw_annotation, palette, '2007_000032_output.png')
编辑:
调色板
是一个3*256个值的列表,格式如下:256个红色值、256个绿色值和256个蓝色值
pil_image
是灰度像素数组,每个像素取0..255范围内的单个值。使用'P'
模式时,像素值k
映射到RGB颜色(调色板[k]、调色板[256+k]、调色板[2*256+k])
。使用“L”模式时,RGB中的颜色仅为k
或(k,k,k)
。模式转换在\u remove\u colormap(文件名)
中丢失。正如问题(以及@taras的答案)中所定义的那样,remove\u colormap
将PIL图像转换为numpy数组\u save\u annotation()
进一步将numpy数组转换为PIL图像。RGB图像将按此方式保存<代码>转换('L')应用于转换为灰度。修改后的函数定义如下:
def _remove_colormap(filename):
img = Image.open(filename).convert('L')
palette = img.getpalette()
print("palette: ", type(palette))
return np.array(img), palette
它与“P”(8位像素,使用调色板映射到任何其他模式)模式有关。当你写你的输出图像时,这个信息丢失了,你得到的是灰度图像。我在这里已经解释得很透彻了。。。谢谢你的回答,可能是重复的。但我不想改变密码。我只是想知道这里的值是如何变化的。转换调色板是否遵循任何已定义的规则?我的意思是[128,0,0]如何变成[1,1,1]基本上,调色板是一个3*256个值的列表,格式为256个红色值、256个绿色值和256个蓝色值。您的
pil_图像
是一个灰度像素数组,每个像素取0..255范围内的单个值。使用'P'
模式时,像素值k
映射到颜色(调色板[k]、调色板[256+k]、调色板[2*256+k])
。在RGB中使用'L'
模式时,颜色只是k
或(k,k,k)
。我认为在P
模式中,像素值k
映射到颜色(调色板[3*k],调色板[3*k+1],调色板[3*k+2])
而不是(调色板[k],调色板[256+k],调色板[2*256+k])
参考:
def _remove_colormap(filename):
img = Image.open(filename).convert('L')
palette = img.getpalette()
print("palette: ", type(palette))
return np.array(img), palette