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

时间:2017-02-22 13:46:30

标签: python opencv

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

A = randi(100,100,255)
imwrite(uint8(A),'myFilename.png','png');

我看过使用from PIL import ImageImage.fromarray()的示例,但它们仅适用于jpeg和3通道png ...

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

3 个答案:

答案 0 :(得分:3)

这是使用opencv / cv2

的解决方案
import cv2
myImg = np.random.randint(255, size=(200, 400)) # create a random image
cv2.imwrite('myImage.png',myImg)

答案 1 :(得分:2)

PIL Image.fromarray()自动确定mode使用from the datatype传递的numpy数组,例如您可以使用的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'

但是,如果您的数组使用兼容的数据类型,只有使用data = np.random.randint(256, size=(100, 100))可能会导致int64数组(typestr <i8),而PIL无法处理。< / p>

您还可以指定其他模式,例如将32位阵列解释为RGB图像:

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

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

然后可以将图片保存为任何格式PIL can handle,例如:img.save('filename.png')

答案 2 :(得分:1)

您可能不希望将OpenCV用于简单的图像处理。如建议的那样,使用PIL:

im = Image.fromarray(arr)
im.save("output.png", "PNG")
你试过这个吗?在这里失败的原因导致你得出结论,这只是JPEG?