在使用PIL的P模式的训练过程中,目标图像的原始值为20和16,因此我将20转换为1,将16转换为2,以训练分割任务。 但是,当我想获取输出图像时,尽管使用了代码,但图片没有着色
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))
但是输出图像是 我用PIL.open看到了值并将其转换为numpy以查看值,部分内容被转换为16和20,模式也为P。 我该如何解决这个问题?
答案 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')