Как напечатать изображение в оттенках серого с альфа-каналом, используя matplotlib? - PullRequest
0 голосов
/ 30 марта 2020

Я пишу простой анализатор PNG, который может декодировать данные PNG и печатать необработанные пиксели, используя matplotlib. У меня нет проблем с печатью RGB, RGBA и чистого оттенка серого.

import matplotlib.pyplot as plt
import numpy as np

with PngParser() as png:
    if png.greyscale:
        plt.imshow(np.array(png.reconstructed_data).reshape((png.height, png.width)), cmap='gray', vmin=0, vmax=255)
        plt.show()
    elif png.greyalhpa:
        ?
    else:
        # RGB, RGBA
        plt.imshow(np.array(png.reconstructed_data).reshape((png.height, png.width, png.bytesPerPixel)))
        plt.show()

Где png.reconstructed_data - простой массив пикселей.

К сожалению, matplotlib явно не поддерживает этот тип изображения. Вот цитата из документации :

Поддерживаемые формы массива:

(M, N): изображение со скалярными данными. Значения сопоставляются с цветами с использованием нормализации и карты цветов. Смотрите параметры норма, cmap, vmin, vmax.

(M, N, 3): изображение со значениями RGB (0-1 с плавающей запятой или 0-255 int).

(M, N, 4): изображение со значениями RGBA (0-1 с плавающей запятой или 0-255 int), то есть с прозрачностью. Первые два измерения (M, N) определяют строки и столбцы изображения.

Наша форма будет (M, N, 2).

Есть ли обходной путь для эта проблема?

1 Ответ

0 голосов
/ 01 апреля 2020

Я думаю, что превращение изображения в градациях серого в RGB-изображение - лучший обходной путь. Вы делаете это путем репликации изображения в каждом канале. Это позволит вам обрабатывать изображения с различными значениями альфа-канала для каждого пикселя.

height = 10
width = 10

# example image
img = np.random.random(size=(height, width, 2))

# separate out image and alpha channel
grayscale = img[:, :, 0]
alpha = img[:, :, 1]

# repeat grayscale image for each channel 
rgb_img = np.dstack((grayscale, grayscale, grayscale, alpha))

fig, ax = plt.subplots(1, 3)
ax[0].imshow(grayscale, cmap='gray')
ax[1].imshow(alpha)
ax[2].imshow(rgb_img)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...