无法用枕头正确打开透明图像

时间:2019-08-31 10:11:21

标签: python image python-imaging-library transparent

我想使用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格式。我已经尝试过在油漆中创建的具有全色png的相同代码,并且所有代码都能正确显示,包括3维numpy数组。

1 个答案:

答案 0 :(得分:0)

您的图片是“调色板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)

我对调色板图像here进行了更详细的说明。