为什么我得到255的所有值?

时间:2017-11-23 12:42:54

标签: python matplotlib

我正在使用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):

enter image description here

2 个答案:

答案 0 :(得分:2)

arr包含除255之外的其他值。(评估np.where(arr != 255)以查看位置。)您看到这么多255的原因是因为图像包含白色边框。要删除白色边框,请参阅Joe Kington'smatehat'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')

enter image description here

答案 1 :(得分:1)

arr = np.asarray(img)扩展为:

arr = []
for b in bytearray(np.asarray(img)):
    if b < 255:
        arr += [b]

显示并非此数组中的所有值都等于255。