matplotlib: come disegnare un rettangolo sull'immagine


139

Come disegnare un rettangolo su un'immagine, in questo modo: inserisci qui la descrizione dell'immagine

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)

Non so come procedere.

Risposte:


251

È possibile aggiungere una Rectanglepatch agli assi matplotlib.

Ad esempio (utilizzando l'immagine del tutorial qui ):

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

inserisci qui la descrizione dell'immagine


Grazie per la tua risposta! Funziona, ma sembra che il rettangolo sia disegnato sull'asse, non sull'immagine stessa. Se provo a salvare l'immagine in un file, il rettangolo non verrà salvato. C'è un modo in cui il rettangolo sostituisce i valori dei pixel sull'immagine? Grazie ancora!
Yanfeng Liu,

Non importa. Ho trovato questo link e sembra funzionare
:)

Se stai ancora riempiendo il rettangolo, passa la fill=Falsebandiera aRectangle
Ivan Talalaev il

7
Questo è strano. La documentazione per patches.Rectangledice che i primi due numeri sono The bottom and left rectangle coordinates. Vedo qui che i primi due numeri, (50.100), corrispondono alla coordinata SUPERIORE e sinistra del rettangolo. Non ho capito bene.
Monica Heddneck,

1
No, il rettangolo è nel posto giusto. È nelle coordinate dei dati. Puoi modificare la trasformazione se la vuoi in coordinate degli assi
tmdavison

20

Hai bisogno di usare le patch.

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

Mi è piaciuto il modo in cui hai incapsulato gli assi all'interno di un oggetto figura: gli assi eseguono la trama, la figura esegue un'interfaccia di alto livello
Alex

19

Non sono necessari sottoprogetti e pyplot può visualizzare immagini PIL, quindi questo può essere ulteriormente semplificato:

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)

Oppure, la versione breve:

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

7

Secondo la mia comprensione matplotlib è una libreria di disegno.

Se si desidera modificare i dati dell'immagine (ad es. Disegnare un rettangolo su un'immagine), è possibile utilizzare ImageDraw , OpenCV di PIL o qualcosa di simile.

Ecco il metodo ImageDraw di PIL per disegnare un rettangolo .

Ecco uno dei metodi di OpenCV per disegnare un rettangolo .

La tua domanda era su Matplotlib, ma probabilmente avrebbe dovuto solo chiedere di disegnare un rettangolo su un'immagine.

Ecco un'altra domanda che affronta ciò che penso tu volessi sapere: disegna un rettangolo e un testo usando PIL

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.