numpy 将元组的块数组转换为PIL图像

jc3wubiy  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(137)

我目前有一个想要转换为PIL图像并保存的NumPy数组或RBG元组。目前我正在做以下工作:final = Image.fromarray(im_arr, mode='RGB')。其中,im_arr(R, G, B)形式的元组的NumPy数组。在创建如下所示的图像时,它似乎最终保持了元组的分离。

8ulbf1ek

8ulbf1ek1#

尝试使用以下功能:

import numpy
import Image

def PIL2array(img):
    return numpy.array(img.getdata(),
                    numpy.uint8).reshape(img.size[1], img.size[0], 3)

def array2PIL(arr, size):
    mode = 'RGBA'
    arr = arr.reshape(arr.shape[0]*arr.shape[1], arr.shape[2])
    if len(arr[0]) == 3:
        arr = numpy.c_[arr, 255*numpy.ones((len(arr),1), numpy.uint8)]
    return Image.frombuffer(mode, size, arr.tostring(), 'raw', mode, 0, 1)

def main():
    img = loadImage('foo.jpg')
    arr = PIL2array(img)
    img2 = array2PIL(arr, img.size)
    img2.save('out.jpg')

if __name__ == '__main__':
    main()

点评:http://code.activestate.com/recipes/577591-conversion-of-pil-image-and-numpy-array/
其他信息:http://www.imagexd.org/tutorial/lessons/0_images_are_arrays.html
如果它不起作用,可能是您的数组没有合适的形状。

w9apscun

w9apscun2#

如果您的数组是一个由窗体宽度、高度和元组组成的数组,则此代码将其转换为可由Image.Fromarray读取的数组数组。

import numpy as np
from PIL import Image

arr = np.array(
    [
        [(178, 158, 165), (185, 196, 191), (207, 222, 226)],
        [(202, 184, 176), (68, 58, 66), (69, 57, 60)],
        [(194, 158, 179), (109, 119, 116), (70, 64, 57)]
    ]
)           # a small example array

shape = arr.shape
new_arr = np.empty((shape[0], shape[1], 3), dtype=np.uint8)
for y, row in enumerate(arr):
    for x, color in enumerate(row):
        new_arr[y, x] = np.array(color)

Image.fromarray(new_arr, "RGB").show()

与另一个答案相比,这可能对较大的图像来说比较慢,但那个答案对我不起作用。

8hhllhi2

8hhllhi23#

为了将表示RGB组件的元组的2D数组还原为我使用的图像,我使用了以下方法:

from PIL import Image
import numpy as np

dt = np.dtype([('x', 'u1'), ('y', 'u1'), ('z', 'u1')])

Image.fromarray(im_arr.astype(dt), 'RGB')

其中im_arr是RGB元组的2D数组。
在我的例子中,我使用uint8(‘u1’)来表示R、G、B组件;如果您的图像组件是不同类型的,请调整dtype-需要进行实验。
这里有类似的问题:以图像的形式显示一个二维Numy数组,其中的内容是元组

相关问题