J'ai le code suivant:
#load in image
image = cv2.imread('lenna.png')
title = "foo"
ax = plt.axes([0,0,1,1])
ax.clear()
height, width = image.shape[:2]
ax.axis('off')
ax.set_title(title)
#some things plotted etc.
Mais ensuite, j'ai besoin de la figure en tant que tableau numpy pour un calcul plus approfondi, donc je fais ce qui suit:
masked_image = image
ax.imshow(masked_image.astype(np.uint8),interpolation="nearest")
ax.figure.canvas.draw()
w,h = ax.figure.get_size_inches()*ax.figure.get_dpi()
I = np.fromstring(ax.figure.canvas.tostring_rgb(),dtype=np.uint8).reshape(int(h),int(w),3)
#Has the white borders around it
Image.fromarray(I)
Cependant, il I
y a encore des bordures blanches autour d'elle, y a-t-il un moyen facile de supprimer les bordures blanches sans enregistrer la figure?
L'image que j'ai utilisée est la suivante:
qui n'a pas de bordures blanches autour
Cependant, après le code ci-dessus, cela ressemble à ce qui suit:
Qui a maintenant des barres blanches autour de lui.
D'autres solutions déjà publiées à ce problème reposent toutes sur la sauvegarde de l'image, ce que je ne veux pas
Peu importe que vous sauvegardiez la figure ou non. Deux conditions doivent être remplies pour ne pas avoir d'espace blanc autour d'une image.
Vous ne devez avoir aucun espace entre les axes et le bord de la figure. Ceci peut être réalisé en définissant les paramètres de sous-tracé
fig, ax = plt.subplots()
fig.subplots_adjust(0,0,1,1)
ou en réglant manuellement la position des axes
fig= plt.figure()
fig.add_axes([0,0,1,1])
Cette dernière est l'approche que vous avez adoptée dans la question, donc cette partie est très bien.
Les images sont affichées avec un aspect égal, ce qui signifie que chaque pixel est au carré. Ceci est généralement souhaité pour les images, mais cela conduit à des axes ne s'étendant pas dans les deux directions de manière égale.
Le problème auquel vous faites face ici est dû au fait que la figure a un aspect différent de l'image.
Supposons que vous ayez une image de forme (n,m)
( m
pixels de large, n
pixels de haut); alors la condition nécessaire pour ne pas avoir d'espace autour de votre image est que
n/m == h/w
où w
, h
sont respectivement la largeur et la hauteur de la figure.
Ainsi, vous pouvez directement définir la taille de la figure sur la forme du tableau multipliée par le dpi,
fig, ax = plt.subplots(figsize=(m*100,n*100), dpi=100)
ou tout autre multiple au cas où vous n'auriez pas besoin d'avoir un pixel par pixel dans la sortie. Dans le cas où vous ne vous souciez pas du tout de la taille de la figure, mais avez toujours besoin d'une figure avec le même aspect que l'image que vous pouvez utiliserfigaspect
figsize=plt.figaspect(image)
Pour fournir un exemple de travail complet ici, ce qui suit crée une figure avec une image qui n'a pas d'espace autour d'elle.
import matplotlib.pyplot as plt
import numpy as np
a = np.random.rand(5,3)
fig, ax = plt.subplots(figsize=plt.figaspect(a))
fig.subplots_adjust(0,0,1,1)
ax.imshow(a)
plt.show()
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots