matplotlib: comment dessiner un rectangle sur l'image

139

Comment dessiner un rectangle sur une image, comme ceci: entrez la description de l'image ici

import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
im = np.array(Image.open('dog.png'), dtype=np.uint8)
plt.imshow(im)

Je ne sais pas comment procéder.

KAI ZHAO
la source

Réponses:

251

Vous pouvez ajouter un Rectanglepatch aux axes matplotlib.

Par exemple (en utilisant l'image du tutoriel ici ):

import matplotlib.pyplot as plt
import matplotlib.patches as patches
from PIL import Image
import numpy as np

im = np.array(Image.open('stinkbug.png'), dtype=np.uint8)

# Create figure and axes
fig,ax = plt.subplots(1)

# Display the image
ax.imshow(im)

# Create a Rectangle patch
rect = patches.Rectangle((50,100),40,30,linewidth=1,edgecolor='r',facecolor='none')

# Add the patch to the Axes
ax.add_patch(rect)

plt.show()

entrez la description de l'image ici

tmdavison
la source
Merci pour votre réponse! Cela fonctionne, mais il semble que le rectangle est dessiné sur l'axe, pas l'image elle-même. Si j'essaye d'enregistrer l'image dans un fichier, le rectangle ne sera pas enregistré. Existe-t-il un moyen pour que le rectangle remplace les valeurs de pixel sur l'image? Merci encore!
Yanfeng Liu
Ça ne fait rien. J'ai trouvé ce lien et il semble fonctionner
:)
Si vous obtenez toujours un rectangle rempli, passez le fill=Falsedrapeau àRectangle
Ivan Talalaev
7
C'est bizarre. La documentation pour patches.Rectangledit que les deux premiers nombres sont The bottom and left rectangle coordinates. Je vois ici que les deux premiers nombres, (50,100), correspondent à la coordonnée HAUT et à gauche du rectangle. Je suis confus.
Monica Heddneck
1
Non, le rectangle est au bon endroit. C'est en coordonnées de données. Vous pouvez modifier la transformation si vous le souhaitez en coordonnées d'axes
tmdavison
20

Vous devez utiliser des correctifs.

import matplotlib.pyplot as plt
import matplotlib.patches as patches

fig2 = plt.figure()
ax2 = fig2.add_subplot(111, aspect='equal')

ax2.add_patch(
     patches.Rectangle(
        (0.1, 0.1),
        0.5,
        0.5,
        fill=False      # remove background
     ) ) 
fig2.savefig('rect2.png', dpi=90, bbox_inches='tight')
Sérénité
la source
J'ai aimé la façon dont vous encapsulez les axes dans un objet figure: les axes font le tracé, la figure fait des trucs d'interface de haut niveau
Alex
19

Il n'y a pas besoin de sous-graphiques et pyplot peut afficher des images PIL, cela peut donc être simplifié davantage:

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
from PIL import Image

im = Image.open('stinkbug.png')

# Display the image
plt.imshow(im)

# Get the current reference
ax = plt.gca()

# Create a Rectangle patch
rect = Rectangle((50,100),40,30,linewidth=1,edgecolor='r',facecolor='none')

# Add the patch to the Axes
ax.add_patch(rect)

Ou, la version courte:

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
from PIL import Image

# Display the image
plt.imshow(Image.open('stinkbug.png'))

# Add the patch to the Axes
plt.gca().add_patch(Rectangle((50,100),40,30,linewidth=1,edgecolor='r',facecolor='none'))
James Burton 'Fluffy'
la source
7

D'après ma compréhension matplotlib est une bibliothèque de traçage.

Si vous souhaitez modifier les données de l'image (par exemple dessiner un rectangle sur une image), vous pouvez utiliser ImageDraw , OpenCV de PIL ou quelque chose de similaire.

Voici la méthode ImageDraw de PIL pour dessiner un rectangle .

Voici l'une des méthodes d' OpenCV pour dessiner un rectangle .

Votre question portait sur Matplotlib, mais aurait probablement dû simplement poser une question sur le dessin d'un rectangle sur une image.

Voici une autre question qui répond à ce que je pense que vous vouliez savoir: dessinez un rectangle et un texte dedans en utilisant PIL

utilisateur3731622
la source