我想在python中从numpy数组写一个单通道png图像? 在Matlab中将是
A = randi(100,100,255)
imwrite(uint8(A),'myFilename.png','png');
我看过使用from PIL import Image
和Image.fromarray()
的示例,但它们仅适用于jpeg和3通道png ...
我已经使用opencv找到了解决方案,我将在此处发布。希望它会缩短其他人的搜索时间......
答案 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?