不能用枕头正确打开透明图片

Can't correctly open transparent image with pillow

我想用 PIL.Image.open() 打开彩色图像并将其转换为 numpy 数组以供进一步分析。

我使用的图片可以下载here

我已经设法打开图像并在 Jupyter Notebook 中将其全彩显示,没有任何问题,但是一旦我使用 getpixel 方法,或使用 numpy 将其转换为数组,事情就出错了。

from PIL import Image
t = Image.open('radar.png')
display(t) 

到目前为止效果很好,图像的透明部分在屏幕上显示为白色。

t.show() 

第一个意外行为,在文件查看器中打开时,透明部分已被全黑替换。仍然可以正确看到颜色。

t.getpixel((200, 200)) 

248

第二个意外行为,我期待看到一个元组,但它是一个数字。

import numpy as np
im2arr = np.asarray(t) 
im2arr.shape

(512, 512)

第三个意外行为,期望得到一个三维数组。

arr2im = Image.fromarray(im2arr)
display(arr2im)

第四个意外行为,图像现在显示为黑色或白色(不是灰度)。应该透明的地方是黑色,应该有颜色的地方是白色。

我怀疑 PIL.Image 在首先打开图像时以某种方式被欺骗,因为第一个像素是透明的或缺失的?它不会注册为 RGBA 格式。我已经尝试使用我在 paint 中创建的全彩色 png 的相同代码,并且它都正确显示,包括 3 维 numpy 数组。

您的图片是 "palette Alpha" 图片。这意味着,它没有 RGBA 通道,而是有一个通道,并且为每个像素存储了一个 8 位索引。该索引在 256 种颜色的调色板中查找 RGBA 值。

您可以打开它并获得您期望的结果,它将每个索引转换为 RGBA 值:

im = Image.open('weather.png').convert('RGBA')

现在如果你转换成Numpy数组,你会得到4个通道,即RGBA:

n = np.array(im)
print(n.shape)                # prints (512,512,4)

我对调色板图像做了更详细的解释