web-dev-qa-db-fra.com

Comment convertir la figure MATPLOTLIB sur l'objet image PIL (sans enregistrer une image)

Comme le titre indique, j'essaie de convertir un fig à un PIL.Image. Je suis actuellement capable de le faire en enregistrant d'abord le disque fig sur le disque, puis à l'ouverture de ce fichier à l'aide de Image.open() mais le processus prend plus de temps que prévu et j'espère qu'en sautant l'économie locale étape, il sera un peu plus rapide.

Voici ce que j'ai jusqu'à présent:

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

J'ai essayé de faire cela après avoir construit la Fig (ce serait juste avant l'étape d'exportation):

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

Mais cela ne montre pas l'image entière. On dirait que c'est une récolte du coin supérieur gauche, mais cela pourrait simplement être une représentation étrange des données - je travaille avec des spectrogrammes afin que les images soient assez abstraites.

9
Zach

Malheureusement, cela n'a pas conduit à une augmentation de la vitesse, mais je posterai toujours ma solution spécifique ci-dessous au cas où quelqu'un a un problème similaire:

# 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 = camp)
fig.subplots_adjust(left = 0, right = 1, bottom = 0, top = 1)
ax.axis('tight'); ax.axis('off')

# convert to PIL Image object
buf = io.BytesIO()
fig.savefig(buf, format='png', dpi = dpi)
buf.seek(0)
pil_img = deepcopy(Image.open(buf))
buf.close()
0
Zach

Je l'ai marqué comme un duplicata et j'ai ensuite fermé parce que j'ai utilisé le mauvais lien.

Quoi qu'il en soit, la réponse peut être ici:

Comment enregistrer une figure Pylab dans un fichier en mémoire qui peut être lu dans l'image PIL?

3
Josh Sharkey