如何将 Matplotlib 图转换为 PIL Image 对象(不保存图像)

2024-02-29

正如标题所述,我正在尝试将fig to a 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)

我在构建无花果后尝试这样做(它将在导出阶段之前):

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

但它没有显示整个图像。它看起来像是左上角的一部分,但它可能只是数据的奇怪表示——我正在使用频谱图,因此图像相当抽象。


EDIT # 2

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

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

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


我今天也一直在看这个。

在 matplotlib 文档中 savefig 函数有这个。

pil_kwargsdict,可选传递的附加关键字参数 保存图形时到 PIL.Image.save 。仅适用于格式 使用 Pillow 保存的文件,即 JPEG、TIFF 和(如果关键字是 设置为非 None 值)PNG。

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

你可以按照这个

Matplotlib:将绘图保存到 numpy 数组 https://stackoverflow.com/questions/7821518/matplotlib-save-plot-to-numpy-array

将其放入 numpy 数组然后执行

PIL.Image.fromarray(array)

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

EDIT:

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

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))

Results

%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 个循环)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Matplotlib 图转换为 PIL Image 对象(不保存图像) 的相关文章

随机推荐

  • 无法分配对象,因为其复制赋值运算符被隐式删除错误

    在我的小型打砖块克隆游戏中 我试图从向量中删除一些值 该向量包含 Brick 类 它们以网格状模式在屏幕上实例化 当球和砖块发生碰撞时 砖块需要消失 我正在尝试用一小段代码来完成此任务 for int i 0 i lt bricks siz
  • CAReplicatorLayer 背后的魔力是什么?

    我觉得 CAReplicatorLayer 有趣的地方是 它能够非常有效地使用不同的变换多次显示 CALayer 如何 看起来它以某种方式重用了复制层的 后备存储 甚至对其应用了一些色调 如何 我想获得源代码或了解 CAReplicator
  • CMD:将 ECHO 管道传输到 SET/在变量中扩展变量

    x 12 3 返回从 x 变量中第 12 个字符开始的 3 个字符 我一直试图完成的是使用变量而不是12 and 3 比方说y 12 and z 3 那么 你就不能使用 x y z 因为 CMD 会认为 x 是一个变量 你能做的是set v
  • IE8 中 IIS7.5 中的 ASP.NET MVC2 的会话不粘连

    我们有一个 ASP NET MVC2 Web 应用程序 由于超出本问题范围的原因 我们决定在应用程序中使用经典会话状态 其中实现了与会话相关的以下功能 global asax 中的 Session Start 事件处理程序在会话中存储变量
  • Python 获取当前 URL

    我如何使用Python获取当前URL 我需要获取当前的 URL 以便我可以检查它的查询字符串 例如 requested url URL HERE url urlparse requested url if url 4 params dict
  • 项目导入需要 Sbt 0.12.4+

    我目前正在阅读Play for Scala Covers Play 2Peter Hilton 的书 出版商 Manning 并尝试坚持他们在书中概述的版本 播放版本 2 1 1 我下载了新的 IntelliJ IDEA 14 CE 应用程
  • Facebook Android SDK 的密钥哈希无效

    我正在尝试使用 Facebook Android SDK 开发一个带有 Facebook 登录按钮的简单应用程序 但我在密钥哈希方面遇到了麻烦 我创建了调试密钥和发布密钥 调试键 keytool exportcert alias andro
  • 如何在 Firefox 中调试 Service Worker?

    在 FF 中调试 Service Worker 似乎非常痛苦 我知道从主页我可以 进入应用程序面板 点击 关于调试 在新页面中搜索我的员工以及其他 200 名员工 单击开始 然后单击检查 我必须寻找两个控制台而不是一个并通过 两者之间的消息
  • git rebase -i HEAD~7 -- 在编辑器中仅显示“noop”

    我正在尝试将位于 HEAD 的提交压缩为后面的提交 当我跑步时git rebase i HEAD 7 但是 我只看到一个noop在编辑器中 我完全不知道这是如何运作的 我在分行工作 cleanup 我创建的 使用checkout b cle
  • 如何检查 VBScript 的默认主机是 WScript 还是 CScript?

    我想知道特定机器上 VBScript 的默认主机是什么 是否设置为 WScript 还是 CScript 例如 如果我使用cscript h cscript s那么有什么方法可以检查主机 VBScript 是否设置为 cscript 我找到
  • 使用逗号运算符是个好习惯吗?

    我最近 实际上仅在 SO 上 遇到了 C C 逗号运算符的使用 据我所知 它在左侧和右侧运算符之间的线上创建了一个序列点 以便您拥有可预测的 定义的 评估顺序 我对为什么要在语言中提供这一点感到有点困惑 因为它似乎是一个可以应用于本来不应该
  • 如何从 vue 3 中的 slot 获取 ref?

    我需要用名字来聚焦参考test1设置一些放置在组件槽中的值 从外部 有可能以某种方式做到这一点吗 我尝试从 refs 或 slots 获取 但失败了 App vue
  • 实时键盘输入到控制台(在 Windows 中)?

    我有一个双向链接列表类 我想在用户键入字符时将字符添加到列表中 或者每次用户按退格键时删除列表中的最后一个节点 同时在控制台中实时显示结果 我将使用哪些函数来拦截单个键盘输入并将其实时显示到控制台 所以结果如下 用户开始输入 Typ 用户停
  • 将列表 1 中的特定数字与列表 2 中的特定数字交换

    最近在温习一些Prolog 我有点喜欢随机提出问题来尝试解决 然后解决它们 但这是相当困难的 我不是一个会放弃我已经着手解决的问题的人 问题 我想创建一个谓词 它有 2 个预先确定的列表 2 个要交换的数字 然后在交换完成后输出列表 进一步
  • 操作 ggpairs 中的轴标题 (GGally)

    我使用下面的代码来生成以下图表 Setup data airquality Device start png filename example png units cm width 20 height 14 res 300 Define c
  • 从字符串中提取最大的数字序列(正则表达式,或?)

    我有类似于以下内容的字符串 4123499 TESCO45 123 every99999994 54 我想分别提取每个字符串中最大的数字序列 4123499 99999994 我以前尝试过正则表达式 我使用的是VB6 Set rx New
  • 将卡片添加到 ListView

    我正在尝试获取列表Cards https docs flutter io flutter material Card class html 并尝试使用Expanded小部件 但得到了overflow error My code new Ex
  • 带有基本身份验证的 SSL 证书问题

    我正在尝试在 web 视图中加载具有基本身份验证的 SSL 页面 但即使我在 onReceivedSslError 中运行proceed 并且 usr pwd 是正确的 我也无法通过 onReceivedHttpAuthRequest 如果
  • 将任意 HTML 插入 DocumentFragment

    我知道adding innerHTML记录片段 http lists w3 org Archives Public public webapps 2011OctDec 0663最近已经讨论过 并且有望包含在 DOM 标准中 但是 您同时应该
  • 如何将 Matplotlib 图转换为 PIL Image 对象(不保存图像)

    正如标题所述 我正在尝试将fig to a PIL Image 我目前可以通过首先保存来做到这一点fig到磁盘 然后使用打开该文件Image open 但该过程花费的时间比预期的要长 我希望通过跳过本地保存步骤 速度会快一点 这是我到目前为