我想使用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数组。
答案 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进行了更详细的说明。