matplotlib: Wie zeichnet man ein Rechteck auf ein Bild?

139

So zeichnen Sie ein Rechteck auf einem Bild wie folgt: Geben Sie hier die Bildbeschreibung ein

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)

Ich weiß nicht, wie ich vorgehen soll.

KAI ZHAO
quelle

Antworten:

250

Sie können Rectangleden matplotlib-Achsen einen Patch hinzufügen.

Zum Beispiel (mit dem Bild aus dem Tutorial hier ):

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

Geben Sie hier die Bildbeschreibung ein

tmdavison
quelle
Danke für deine Antwort! Es funktioniert, aber es scheint, dass das Rechteck auf der Achse gezeichnet ist, nicht auf dem Bild selbst. Wenn ich versuche, das Bild in einer Datei zu speichern, wird das Rechteck nicht gespeichert. Gibt es eine Möglichkeit, dass das Rechteck die Pixelwerte auf dem Bild ersetzt? Danke noch einmal!
Yanfeng Liu
Keine Ursache. Ich habe diesen Link gefunden und es scheint zu funktionieren
Yanfeng Liu
Wenn Sie immer noch gefülltes Rechteck bekommen, übergeben Sie fill=FalseFlagge anRectangle
Ivan Talalaev
7
Das ist komisch. Die Dokumentation für patches.Rectanglebesagt, dass die ersten beiden Zahlen sind The bottom and left rectangle coordinates. Ich sehe hier, dass die ersten beiden Zahlen (50.100) der oberen und linken Koordinate des Rechtecks ​​entsprechen. Ich bin verwirrt.
Monica Heddneck
1
Nein, das Rechteck ist an der richtigen Stelle. Es ist in Datenkoordinaten. Sie können die Transformation ändern, wenn Sie es in
Achsenkoordinaten
20

Sie müssen Patches verwenden.

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')
Gelassenheit
quelle
Mir hat gefallen, wie Sie Achsen in ein Figurenobjekt eingekapselt haben: Achsen zeichnen, Figuren machen hochrangige Schnittstellen
Alex
19

Es sind keine Unterzeichnungen erforderlich, und Pyplot kann PIL-Bilder anzeigen, sodass dies weiter vereinfacht werden kann:

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)

Oder die Kurzversion:

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 'Fluffy' Burton
quelle
7

Nach meinem Verständnis ist matplotlib eine Plotbibliothek .

Wenn Sie die Bilddaten ändern möchten (z. B. ein Rechteck auf einem Bild zeichnen), können Sie ImageDraw , OpenCV oder ähnliches von PIL verwenden .

Hier ist die ImageDraw-Methode von PIL zum Zeichnen eines Rechtecks .

Hier ist eine der OpenCV-Methoden zum Zeichnen eines Rechtecks .

Ihre Frage bezog sich auf Matplotlib, hätte aber wahrscheinlich nur nach dem Zeichnen eines Rechtecks ​​auf einem Bild fragen sollen.

Hier ist eine weitere Frage, die sich mit dem befasst, was Sie meiner Meinung nach wissen wollten: Zeichnen Sie mit PIL ein Rechteck und einen Text darin

user3731622
quelle