Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tensorflow Deeplab图像彩色贴图消除混淆_Python_Image Processing_Python Imaging Library - Fatal编程技术网

Python Tensorflow Deeplab图像彩色贴图消除混淆

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

在下面的代码中,我只看到一个图像被再次读写。但是图像像素值是如何发生如此剧烈的变化的?显然,将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]

代码的实际来源是

编辑: 正如@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