import matplotlib.pyplot as plt
import numpy as np
# Make a random plot...
fig = plt.figure()
fig.add_subplot(111)
# If we haven't already shown or saved the plot, then we need to
# draw the figure first...
fig.canvas.draw()
# Now we can save it to a numpy array.
data = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,))
from moviepy.video.io.bindings import mplfig_to_npimage
import matplotlib.pyplot as plt
fig = plt.figure() # make a figure
numpy_fig = mplfig_to_npimage(fig) # convert it to a numpy array
8条答案
按热度按时间xbp102n01#
当您需要与保存的绘图进行像素到像素的比较时,这对于单元测试等是一个方便的技巧。
一种方法是使用
fig.canvas.tostring_rgb
,然后使用numpy.fromstring
和适当的dtype。还有其他方法,但这是我倾向于使用的方法。例如
v1l68za42#
@JUN_NETWORKS的答案有一个更简单的选择,即不将图形保存为
png
,而是使用其他格式,如raw
或rgba
,并跳过cv2
解码步骤。换句话说,实际的情节到 numpy 转换归结为:
霍普,这个有用
jgwigjjp3#
有人提出一种方法,是这样的
当然,这段代码可以工作。但是,输出numpy数组图像的分辨率太低了。
我的提案代码是。
此代码运行良好。
如果在dpi参数上设置了一个较大的数字,则可以获得numpy数组形式的高分辨率图像。
brqmpdu14#
是时候对解决方案进行基准测试了。
在这种情况下,IO原始缓冲区是将matplotlib图形转换为numpy数组的最快缓冲区。
附加备注:
第一个月
channel x height x width
的数组,请执行以下操作im = im.transpose((2, 0, 1))
.mfpqipee5#
MoviePy使得把一个图形转换成numpy数组变得非常简单,它有一个内置函数
mplfig_to_npimage()
,你可以这样使用它:jvidinwx6#
如果有人想要一个即插即用的解决方案,而不需要修改任何先前的代码(获取pyplot图的引用和所有),下面的代码对我来说很有用。
yyyllmsg7#
正如Joe Kington所指出的,一种方法是在画布上绘制,将画布转换为字节字符串,然后将其重新塑造为正确的形状。
但是,由于
canvas.get_width_height()
返回显示坐标中的宽度和高度,因此有时会出现缩放问题,这些问题可以在此答案中解决。x0fgdtte8#
Jonan Gueorguiev整理了答案: