不能用枕头正确打开透明图片
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)
我对调色板图像做了更详细的解释。
我想用 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)
我对调色板图像做了更详细的解释