如何将RGB PIL图像转换为具有3个通道的numpy数组?

37

我正在使用以下代码加载图像

image = PIL.Image.open(file_path)
image = np.array(image)

它起作用了,但数组的大小似乎为(X, X, 4),也就是说它有4个层。我想要普通的RGB层。这可能吗?

更新

我发现仅删除第四个通道是不够的,需要以下代码:

image = PIL.Image.open(file_path)
image.thumbnail(resample_size)
image = image.convert("RGB")
image = np.asarray(image, dtype=np.float32) / 255
image = image[:, :, :3]
为什么?

3
只需剪切三个通道:image[...,:3] - Divakar
1
第四层是alpha(即透明度)通道。你确定不要吗? - Warren Weckesser
@WarrenWeckesser 我正在读取JPEG文件,据我所知它们不包含alpha通道。 - Dims
当我执行np.asarray(my_pil_img).shape时,它会在一个没有alpha通道的480x640 .png图像上返回(480, 640, 3)。自此贴文以来,这个问题是否已经在后续版本中得到了“修复”? - Thomas Fauskanger
2个回答

41

第四层是支持透明度的图片格式(如PNG)的透明度值。如果您移除第四个值,它将成为没有透明度的正确的RGB图像。

注意:

例如:

>>> import PIL.Image
>>> image = PIL.Image.open('../test.png')
>>> import numpy as np
>>> image = np.array(image)
>>> image.shape
(381, 538, 4)
>>> image[...,:3].shape
(381, 538, 3)

这将形状从(64, 64, 4)更改为(22, 64, 4) - Dims
由于@Divakar的正确示例,修复了编辑。 - keredson

4

如其他答案所述,有些图像被保存为带有第四通道的格式。 为了仅加载具有 RGB 通道的图像,且不使用 numpy

from PIL import Image
image = Image.open('../test.png').convert('RGB')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接