我正在编写一个简单的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)。
这个问题有什么解决办法吗?
发布于 2020-03-31 23:37:43
我认为将灰度图像转换为RGB图像是最好的解决方法。您可以通过复制每个通道中的图像来做到这一点。这将允许您处理每个像素具有不同alpha值的图像。
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)
https://stackoverflow.com/questions/60938820
复制相似问题