我想从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 Image ,Image.fromarray()但是它们仅用于jpeg和3通道png。
我已经使用opencv找到了解决方案,我将在这里发布。希望它将缩短其他人的搜索...
这是使用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)
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')