Получите цвета RGB из изображения цветовой палитры и примените к двоичному изображению

У меня есть изображение цветовой палитры, такое как this one, и бинаризованное изображение в массиве numpy, например квадрат например, это:

img = np.zeros((100,100), dtype=np.bool)
img[25:75,25:75] = 1

(Реальные изображения, конечно, сложнее.)

Я бы хотел сделать следующее:

  1. Извлеките все цвета RGB из изображения цветовой палитры.

  2. Для каждого цвета сохраните копию img этого цвета с прозрачным фоном.

В моем коде (см. Ниже) можно сохранить img как черный объект с прозрачным фоном. Я борюсь с хорошим способом извлечения цветов RGB, чтобы я мог применить их к изображению.

# Create an MxNx4 array (RGBA)
img_rgba = np.zeros((img.shape[0], img.shape[1], 4), dtype=np.bool)

# Fill R, G and B with inverted copies of the image
# Note: This creates a black object; instead of this, I need the colors from the palette.
for c in range(3):
    img_rgba[:,:,c] = ~img

# For alpha just use the image again (makes background transparent)
img_rgba[:,:,3] = img

# Save image
imsave('img.png', img_rgba) 

person Community    schedule 05.08.2017    source источник


Ответы (1)


Вы можете использовать комбинацию reshape и np.unique для извлечения уникальных значений RGB из изображения цветовой палитры:

# Load the color palette
from skimage import io
palette = io.imread(os.path.join(os.getcwd(), 'color_palette.png'))

# Use `np.unique` following a reshape to get the RGB values
palette = palette.reshape(palette.shape[0]*palette.shape[1], palette.shape[2])
palette_colors = np.unique(palette, axis=0)

(Обратите внимание, что аргумент axis для np.unique был добавлен в numpy версии 1.13.0, поэтому вам может потребоваться обновить numpy, чтобы это работало.)

Когда у вас есть palette_colors, вы можете в значительной степени использовать код, который у вас уже есть, для сохранения изображения, за исключением того, что теперь вы добавляете различные значения RGB вместо копий ~img в ваш массив img_rgba.

for p in range(palette_colors.shape[0]):

    # Create an MxNx4 array (RGBA)
    img_rgba = np.zeros((img.shape[0], img.shape[1], 4), dtype=np.uint8)

    # Fill R, G and B with appropriate colors
    for c in range(3):
        img_rgba[:,:,c] = img.astype(np.uint8) * palette_colors[p,c]

    # For alpha just use the image again (makes background transparent)
    img_rgba[:,:,3] = img.astype(np.uint8) * 255

    # Save image
    imsave('img_col'+str(p)+'.png', img_rgba)

(Обратите внимание, что вам нужно использовать np.uint8 в качестве типа данных для вашего изображения, поскольку двоичные изображения, очевидно, не могут представлять разные цвета.)

person WhoIsJack    schedule 05.08.2017