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.

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


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

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.