我正在使用BytIO首先将绘图(matplotlib)转换为PNG格式,然后获取PNG图像的数组,这里是代码:
from matplotlib import pyplot as plt
import numpy as np
import io
from PIL import Image
fig, ax = plt.subplots()
ax.text(0.0,0.0,"Test", fontsize=45)
ax.axis('off')
ax.imshow(np.random.random((3,3)))
with io.BytesIO() as memf:
fig.savefig(memf, format='PNG')
memf.seek(0)
img = Image.open(memf).convert('RGB')
arr = np.asarray(img)
img.show()
plt.show()
print(arr)
图像看起来很好,但是数组不是,它在所有3维(RGB)中显示所有值为255。我做错了什么?
这是图片(img):
答案 0 :(得分:2)
arr
包含除255之外的其他值。(评估np.where(arr != 255)
以查看位置。)您看到这么多255的原因是因为图像包含白色边框。要删除白色边框,请参阅Joe Kington's或matehat's方法。例如,使用Joe Kington的方法(控制extent
):
from PIL import Image
import io
from matplotlib import pyplot as plt
import numpy as np
fig, ax = plt.subplots()
ax.axis('off')
ax.text(0.0,0.0,"Test", fontsize=45)
ax.imshow(np.random.random((3,3)))
with io.BytesIO() as memf:
extent = ax.get_window_extent()
extent = extent.transformed(fig.dpi_scale_trans.inverted())
fig.savefig(memf, format='PNG', bbox_inches=extent)
memf.seek(0)
img = Image.open(memf).convert('RGB')
arr = np.asarray(img)
img.save('/tmp/out.png')
答案 1 :(得分:1)
将arr = np.asarray(img)
扩展为:
arr = []
for b in bytearray(np.asarray(img)):
if b < 255:
arr += [b]
显示并非此数组中的所有值都等于255。