Matplotlib画布作为numpy数组的人工制品

Pau*_*aul 11 python numpy matplotlib

我想将matplotlib图转换为numpy数组.我已经能够通过直接访问渲染器的内容来做到这一点.然而,当我在numpy数组上调用imshow时,它看起来像沿着边缘的混叠伪像,原始图中不存在.

我试过玩各种参数,但无法弄清楚如何修复imshow中的人工制品.如果将图形保存到图像文件,则图像的差异仍然存在.

请注意,我想要实现的是一种确认数组内容与我之前看到的数字相同的方法.我想可能这些人工制品并不存在于numpy数组中,而是在imshow调用期间创建的.也许appshow的appror配置可以解决问题.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Rectangle
import math

fig = plt.figure(frameon=False)
ax = plt.gca()
ax.add_patch(Rectangle((0,0), 1, 1, angle=45, color="red"))
ax.set_xlim(-2,2)
ax.set_ylim(-2,2)
ax.set_aspect(1)
plt.axis("off")
fig.canvas.draw()
plt.savefig("rec1.png")
plt.show()
X = np.array(fig.canvas.renderer._renderer)

fig = plt.figure(frameon=False)
ax = plt.gca()
plt.axis("off")
plt.imshow(X)
plt.savefig("rec2.png")
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Pau*_*aul -1

感谢指出插值原因的评论。我找到了以下代码(适用于 Python 3),它以我想要的方式显示图像;与第一张图像相同,但通过 numpy 数组。

import PIL.Image
from io import BytesIO
import IPython.display
import numpy as np
def showarray(a, fmt='png'):
    a = np.uint8(a)
    f = BytesIO()
    PIL.Image.fromarray(a).save(f, fmt)
    IPython.display.display(IPython.display.Image(data=f.getvalue()))
Run Code Online (Sandbox Code Playgroud)

来源:https ://gist.github.com/kylemcdonald/2f1b9a255993bf9b2629