python - PIL : Image. fromarray(img.astype ('uint8' ), mode ='RGB' ) 返回灰度图像

标签 python numpy python-imaging-library

我已经转换了大小为 torch.Size([3, 28, 28]) 的 pytorch 张量大小为 (28, 28, 3) 的 numpy 数组,而且似乎没有任何问题。然后我尝试使用 img = Image.fromarray(img.astype('uint8'), mode='RGB') 将其转换为 PIL 图像,但是返回的尺寸 img(28, 28) ,当我期望它是 (28, 28, 3) 时(或(3, 28, 28))。我不明白为什么会这样。我确保转换为 uint8 并使用 RGB 模式,正如其他海报在线建议的那样,但是这些(或使用 np.ascontiguousarray )都没有帮助。

PIL版本1.1.7

# This code implements the __getitem__ function for a child class of datasets.MNIST in pytorch
# https://pytorch.org/docs/stable/_modules/torchvision/datasets/mnist.html#MNIST

img, label = self.data[index], self.targets[index]
assert img.shape == (3, 28, 28), \
       (f'[Before PIL] Incorrect image shape: expecting (3, 28, 28),'
        f'received {img.shape}')

print('Before reshape:', img.shape)    # torch.Size([3, 28, 28])
img = img.numpy().reshape(3, 28, 28)
img = np.stack([img[0,:,:], img[1,:,:], img[2,:,:]], axis=2)
print('After reshape:', img.shape)     # (28, 28, 3)

# doing this so that it is consistent with all other datasets
# to return a PIL Image
img = Image.fromarray(img.astype('uint8'), mode='RGB') # Returns 28 x 28 image

assert img.size == (3, 28, 28), \
       (f'[Before Transform] Incorrect image shape: expecting (3, 28, 28), '
        f'received {img.size}')

编辑:这是一个最小的例子。我将把上面的内容留给上下文,以防它有任何帮助。

from PIL import Image
import numpy as np

img = np.random.randn(28, 28, 3)
img = Image.fromarray(img.astype('uint8'), mode='RGB') # Returns 28 x 28 image

assert img.size == (28, 28, 3), \
       (f'[Before Transform] Incorrect image shape: expecting (3, 28, 28), '
        f'received {img.size}')

AssertionError: [Before Transform] Incorrect image shape: expecting (3, 28, 28), received (28, 28)

最佳答案

我想你想要这个,其中 RGB 值的范围是 0..255 范围内的整数:

import numpy as np
from PIL import Image

# Make random 28x28 RGB image
img =np.random.randint(0,256,(28,28,3), dtype=np.uint8)

# Convert to PIL Image
pImg=Image.fromarray(img, mode='RGB')

现在检查我们有什么:

In [19]: pImg                                                                                       
Out[19]: <PIL.Image.Image image mode=RGB size=28x28 at 0x120CE9CF8>

并保存:

pImg.save('result.png')

enter image description here

关于python - PIL : Image. fromarray(img.astype ('uint8' ), mode ='RGB' ) 返回灰度图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56330561/

相关文章:

python - 使用无服务器的 Numpy lambda 错误

Python - 使用 PIL 绘制不同颜色的簇

python - 如何垂直合并两个图像?

python - 使用 Python 从字符串中提取 IP

python - 运行 Django 自定义管理命令 - 路径问题

python - 使用 numpy/scipy 将 3D 点的最近点投影到 3D 三角形

python - 使用polyval和polyfit在半对数图表上绘制线性回归

python - 如何将 PIL.ImageTk.PhotoImage 保存为 jpg

python - 如何在 Python 中从一长串信息重新创建嵌套列表?

python - 对于字典中的键,如果键 ==x :