Как преобразовать выходные изображения сети в цветные изображения с целью P в режиме P? - PullRequest
1 голос
/ 11 октября 2019

Исходное значение в целевых изображениях составляет 20 и 16 в процессе обучения с режимом P PIL, поэтому я преобразовываю 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. Откройте и преобразуйте его в numpy, чтобы увидеть значения, часть преобразована в 16 и 20, режим тоже P. Как я могу справиться с этой проблемой?

1 Ответ

1 голос
/ 12 октября 2019

Похоже, вам удалось преобразовать все пиксели с индексом 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')
...