如何将网络输出图像转换为目标为PIL的P模式的彩色图像?

时间:2019-10-11 13:35:29

标签: python-imaging-library pytorch image-segmentation

在使用PIL的P模式的训练过程中,目标图像的原始值为20和16,因此我将20转换为1,将16转换为2,以训练分割任务。original target image 但是,当我想获取输出图像时,尽管使用了代码,但图片没有着色

        pred=pred.reshape([512,512]).astype('uint8')
        (x, y) = pred.shape
        for xx in range(x):
            for yy in range(y):
                if pred[xx, yy] == 2:
                    pred[xx, yy] = 16
                elif pred[xx, yy] == 1:
                    pred[xx, yy] = 20
        pp = Image.fromarray(pred).convert('P')
        pp.save(r'E:\python_workspace\0711\run\pascal\{}.png'.format(i))

但是输出图像是 output image 我用PIL.open看到了值并将其转换为numpy以查看值,部分内容被转换为16和20,模式也为P。 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您似乎设法将索引20的所有像素都更改为索引1,索引16的所有像素都更改为2。但是,然后,您需要将调色板条目20复制到调色板条目1,并将调色板条目16复制到调色板条目2。为了使颜色保持不变。

所以,您想要:

import numpy as np
from PIL import Image

# Load image
im = Image.open('R0T9R.png')

# Get palette and make into Numpy array of 256 entries of 3 RGB colours
palette = np.array(im.getpalette(),dtype=np.uint8).reshape((256,3))

# Set palette entry 1 the same as entry 20, and 2 the same as 16
palette[1] = palette[20]
palette[2] = palette[16]

# Change pixels too - this replaces your slow "for" loops
npim = np.array(im)
npim[npim==16] = 2
npim[npim==20] = 1

# Make Numpy array back into image
res = Image.fromarray(npim)

# Apply our modified palette and save
res.putpalette(palette.ravel().tolist())
res.save('result.png')