Python:如何从numpy数组写入单个通道png文件?

mcE*_*nge 2 python opencv

我想从python中的numpy数组中写入一个单通道png图像?在Matlab中

A = randi(100,100,255)
imwrite(uint8(A),'myFilename.png','png');
Run Code Online (Sandbox Code Playgroud)

我看到了使用的pelpels from PIL import ImageImage.fromarray()但是它们仅用于jpeg和3通道png。

我已经使用opencv找到了解决方案,我将在这里发布。希望它将缩短其他人的搜索...

mcE*_*nge 5

这是使用opencv / cv2的解决方案

import cv2
myImg = np.random.randint(255, size=(200, 400)) # create a random image
cv2.imwrite('myImage.png',myImg)
Run Code Online (Sandbox Code Playgroud)


mat*_*ata 5

PIL 会根据传递的 numpy 数组的数据类型Image.fromarray()自动确定要使用的模式,例如,您可以使用 8 位灰度图像:

from PIL import Image
import numpy as np

data = np.random.randint(256, size=(100, 100), dtype=np.uint8)
img = Image.fromarray(data)  # uses mode='L'
Run Code Online (Sandbox Code Playgroud)

但是,这仅在您的数组使用兼容的数据类型时才有效,如果您只是使用data = np.random.randint(256, size=(100, 100))它可能会导致<i8PIL 无法处理的 int64 数组(typestr )。

您还可以指定不同的模式,例如将 32 位数组解释为 RGB 图像:

data = np.random.randint(2**32, size=(100, 100), dtype=np.uint32)
img = Image.fromarray(data, mode='RGB')
Run Code Online (Sandbox Code Playgroud)

在内部Image.fromarray()只是尝试猜测正确的模式和大小,然后调用Image.frombuffer().

然后可以将图像保存为PIL 可以处理的任何格式,例如:img.save('filename.png')