正如标题所述,我正试图将fig分转换为PIL.Image分.目前,我可以先将fig保存到磁盘,然后使用Image.open()打开该文件,但这个过程比预期的要长,我希望通过跳过本地保存步骤,速度会快一点.

以下是我目前掌握的情况:

# build fig
figsize, dpi = self._calc_fig_size_res(img_height)
fig = plt.Figure(figsize=figsize)
canvas = FigureCanvas(fig)
ax = fig.add_subplot(111)
ax.imshow(torch.from_numpy(S).flip(0), cmap = cmap)
fig.subplots_adjust(left = 0, right = 1, bottom = 0, top = 1)
ax.axis('tight'); ax.axis('off')

# export
fig.savefig(export_path, dpi = dpi)

# open image as PIL object
img = Image.open(export_path)

我在构建fig后try 过这样做(在导出阶段之前):

pil_img = Image.frombytes('RGB', canvas.get_width_height(), canvas.tostring_rgb())

但它并没有显示整个图像.它看起来像是左上角的一个片段,但它可能只是数据的一个奇怪的表示形式——我正在处理 spectral 图,所以图像相当抽象.

推荐答案

编辑#2

PIL.Image.frombytes('RGB', 
fig.canvas.get_width_height(),fig.canvas.tostring_rgb())

与下面的35/40ms相比,大约需要2ms.

这是迄今为止我能找到的最快的方法.


我今天也一直在看这个.

在matplotlib文档中,savefig函数具有以下功能.

sdu,传递的附加参数是可选的

这一定意味着它在保存之前已经是一个pil图像,但我看不到它.

你可以跟着这个

Matplotlib: save plot to numpy array

将其放入numpy数组,然后

比尔.形象fromarray(数组)

您可能需要使用数组[:,:,::-1]将通道从BGR反转为RGB

编辑:

到目前为止,我已经测试了每种方法.

import io
    
def save_plot_and_get():
    fig.savefig("test.jpg")
    img = cv2.imread("test.jpg")
    return PIL.Image.fromarray(img)
    
def buffer_plot_and_get():
    buf = io.BytesIO()
    fig.savefig(buf)
    buf.seek(0)
    return PIL.Image.open(buf)
    
def from_canvas():
    lst = list(fig.canvas.get_width_height())
    lst.append(3)
    return PIL.Image.fromarray(np.fromstring(fig.canvas.tostring_rgb(),dtype=np.uint8).reshape(lst))

后果

%timeit save_plot_and_get()

每个回路35.5 ms±148µs(7次运行的平均值±标准偏差,每个10个回路)

%timeit save_plot_and_get()

每个回路35.5 ms±142µs(7次运行的平均值±标准偏差,每个10个回路)

%timeit buffer_plot_and_get()

每个回路40.4 ms±152µs(7次运行的平均值±标准偏差,每个10个回路)

Python-3.x相关问答推荐

我不能使用拆分来分隔数据

在循环中使用Print&S结束参数时出现奇怪的问题

Python中根据分组/ID对两个数据框进行映射,以更接近值的升序排列

如何立即从asyncio.Task获取异常?

从一列字符串中提取子字符串并将它们放入列表中

拆分列表的元素并将拆分后的元素包含到列表中

如果原始字符串包含正斜杠,如何返回具有不同可能性的新字符串

Python ** 用于负数

XPATH:使用 .find_elements_by_xpath 为未知数量的 xpath 输入值

如何使用 Selenium by class_name 从大学橄榄球数据中抓取图像 url 列表

如何查找 tensorflow.python.data.ops.dataset_ops.MapDataset 对象的大小或形状,make_csv_dataset 的输出

pip install mysqlclient 失败为 mysqlclient 运行 setup.py bdist_wheel ... 错误

使用 python 正则表达式匹配日期

如何在 Python 3 中通过 IP 获取 WhoIs 信息?

如何在 Selenium 和 Python 中使用类型查找元素

Python在OrderedDict中 Select 第i个元素

Python 的 unittest 和 unittest2 模块有什么区别?

TypeError:只有整数标量数组可以转换为标量索引

没有名为urlparse的模块,但我没有使用 urlparse

什么是ANSI_X3.4-1968编码?