我正在尝试使用PIL.Image.fromarray
:
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
a = np.array([[[255, 0, 0], [0, 255, 0], [0, 0, 255]]])
im = Image.fromarray(a, mode="RGB")
im.save("test.png")
plt.imshow(im)
plt.show()
我希望看到红色,绿色和蓝色三个像素。
但是,如果我如文档示例中所示省略了mode
关键字参数,则会得到:
TypeError:无法处理此数据类型
如果我设置了mode="RGB"
,则保存的图像文件test.png
和matplotlib
窗口都看起来像这样:
答案 0 :(得分:1)
堆叠三个数组,然后根据this和this的答案将它们转换为uint8
类型。
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
a = (np.dstack(([255, 0, 0],[0, 255, 0],[0, 0, 255]))).astype(np.uint8)
im = Image.fromarray(a, mode="RGB")
im.save("test.png")
plt.imshow(im)
plt.show()
替代选项是向输入数组添加额外的尺寸,使其形状为(1, 3, 3)
a = np.array([[[255, 0, 0], [0, 255, 0], [0, 0, 255]]], dtype=np.uint8)
im = Image.fromarray(a, mode="RGB")
答案 1 :(得分:0)
根据https://pillow.readthedocs.io/en/latest/handbook/concepts.html#concept-modes模式RGB
应该是3x8位像素。但是,numpy.ndarray
默认情况下具有类型int64
:
>>> a = np.array([[[255, 0, 0], [0, 255, 0], [0, 0, 255]]])
>>> a.dtype
dtype('int64')
那是
TypeError:无法处理此数据类型
来自。如果我为数组设置了正确的8位dtype
关键字,即使没有指定mode
关键字,一切也可以正常工作
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
a = np.array([[[255, 0, 0], [0, 255, 0], [0, 0, 255]]])
im = Image.fromarray(a, mode="RGB")
im.save("test.png")
plt.imshow(im)
plt.show()