我想从python中的numpy数组写一个单通道png图像?在Matlab中即可
A = randi(100,100,255) imwrite(uint8(A),'myFilename.png','png');
我看过使用 from PIL import Image 和 Image.fromarray() 的示例,但它们仅用于jpeg和3通道png ...
from PIL import Image
Image.fromarray()
我已经使用opencv找到了解决方案,我将在此处发布 . 希望它会缩短别人的搜索...
PIL的 Image.fromarray() 自动确定mode使用传递的numpy数组的from the datatype,例如您可以使用的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无法处理 .
data = np.random.randint(256, size=(100, 100))
<i8
您还可以指定其他模式,例如将32位数组解释为RGB图像:
data = np.random.randint(2**32, size=(100, 100), dtype=np.uint32) img = Image.fromarray(data, mode='RGB')
在内部Image.fromarray()只是尝试猜测正确的模式和大小,然后调用 Image.frombuffer() .
Image.frombuffer()
然后可以将图像保存为任何格式 PIL can handle例如:img.save('filename.png')
PIL
这是一个使用opencv / cv2的解决方案
import cv2 myImg = np.random.randint(255, size=(200, 400)) # create a random image cv2.imwrite('myImage.png',myImg)
您可能不希望将OpenCV用于简单的图像处理 . 如建议的那样,使用PIL:
im = Image.fromarray(arr) im.save("output.png", "PNG")
你试过这个吗?什么在这里失败,导致你得出结论,这只是JPEG?
3 回答
PIL的
Image.fromarray()
自动确定mode使用传递的numpy数组的from the datatype,例如您可以使用的8位灰度图像:但是这只适用于您的数组使用兼容的数据类型,如果您只是使用
data = np.random.randint(256, size=(100, 100))
,这可能会导致一个int64数组(typestr<i8
),PIL无法处理 .您还可以指定其他模式,例如将32位数组解释为RGB图像:
在内部Image.fromarray()只是尝试猜测正确的模式和大小,然后调用
Image.frombuffer()
.然后可以将图像保存为任何格式
PIL
can handle例如:img.save('filename.png')这是一个使用opencv / cv2的解决方案
您可能不希望将OpenCV用于简单的图像处理 . 如建议的那样,使用PIL:
你试过这个吗?什么在这里失败,导致你得出结论,这只是JPEG?