将numpy数组转换为RGB图像

9

我有一个值范围从0-255numpy 数组。 我想将其转换为3通道RGB图像。 我使用PIL Image.convert()函数,但它将其转换为灰度图像。

我正在使用Python的PIL库将numpy数组转换为图像,代码如下:

imge_out = Image.fromarray(img_as_np.astype('uint8'))
img_as_img = imge_out.convert("RGB")

输出将图像转换为3个通道,但以黑白(灰度)图像显示。如果我使用以下代码:
img_as_img = imge_out.convert("R")

它显示。
error conversion from L to R not supported

我该如何正确地将numpy数组转换成RGB图片?


可能是重复的问题:如何将RGB图像转换为numpy数组? - Daniel F
请展示一下你的代码。 - offeltoffel
@DanielF 不,它并没有解决我的问题,因为它以图像作为输入,而我的数据已经是csv格式了。当您将图像作为输入时,默认情况下会得到3个通道,而我的数据只有1个通道。 - Avyukth
1个回答

10
你需要一个正确大小的numpy数组,即一个HxWx3的整数数组。我使用以下代码和输入进行了测试,似乎按预期工作。
import os.path
import numpy as np
from PIL import Image


def pil2numpy(img: Image = None) -> np.ndarray:
    """
    Convert an HxW pixels RGB Image into an HxWx3 numpy ndarray
    """

    if img is None:
        img = Image.open('amsterdam_190x150.jpg'))

    np_array = np.asarray(img)
    return np_array


def numpy2pil(np_array: np.ndarray) -> Image:
    """
    Convert an HxWx3 numpy array into an RGB Image
    """

    assert_msg = 'Input shall be a HxWx3 ndarray'
    assert isinstance(np_array, np.ndarray), assert_msg
    assert len(np_array.shape) == 3, assert_msg
    assert np_array.shape[2] == 3, assert_msg

    img = Image.fromarray(np_array, 'RGB')
    return img


if __name__ == '__main__':
    data = pil2numpy()
    img = numpy2pil(data)
    img.show()

amsterdam_190x150.jpg

我使用的版本:

  • Python 3.6.3
  • numpy 1.14.2
  • Pillow 4.3.0

感谢您的回复,正如您所指出的,RGB图像必须有3个通道。我正在处理时尚数据集,该数据集是灰度和单通道的。 - Avyukth
1
@Avyukth 这个方法似乎会扭曲图像... https://dev59.com/A7voa4cB1Zd3GeqP5YUx - Ludovico Verniani
只有在与OpenCV功能结合使用时,它才会扭曲图像,但这里没有使用。 - physicalattraction
@physicalattraction 你有没有什么办法可以防止它在使用opencv时扭曲图像? - Mika C.
我从未使用过OpenCV,所以对它一无所知。 - physicalattraction

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