gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:14:34 26 4
gpt4 key购买 nike

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

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

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

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

最佳答案

编辑#2

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

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

这是目前为止我能找到的最快的方法。


我今天也在看这个。

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

pil_kwargsdict, optional Additional keyword arguments that are passedto PIL.Image.save when saving the figure. Only applicable for formatsthat are saved using Pillow, i.e. JPEG, TIFF, and (if the keyword isset to a non-None value) PNG.

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

你可以按照这个

Matplotlib: save plot to numpy array

把它放到一个numpy数组中然后做

PIL.Image.fromarray(数组)

您可能需要使用数组 [:, :,::-1]

将 channel 从 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 毫秒 ± 148 µs(7 次运行的平均值 ± 标准偏差,每次 10 次循环)

%timeit save_plot_and_get()

每个循环 35.5 毫秒 ± 142 µs(7 次运行的平均值 ± 标准偏差,每次 10 次循环)

%timeit buffer_plot_and_get()

每个循环 40.4 毫秒 ± 152 µs(7 次运行的平均值 ± 标准偏差,每次 10 次循环)

关于python - 如何将 Matplotlib 图转换为 PIL 图像对象(不保存图像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57316491/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com