matplotlib: cara menggambar persegi panjang pada gambar

139

Cara menggambar persegi panjang pada gambar, seperti ini: masukkan deskripsi gambar di sini

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)

Saya tidak tahu bagaimana melanjutkan.

KAI ZHAO
sumber

Jawaban:

251

Anda dapat menambahkan Rectangle patch ke Axes matplotlib.

Misalnya (menggunakan gambar dari tutorial di sini ):

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

masukkan deskripsi gambar di sini

tmdavison
sumber
Terima kasih atas jawaban anda! Ini bekerja, tetapi tampaknya bahwa persegi panjang digambar pada sumbu, bukan gambar itu sendiri. Jika saya mencoba menyimpan gambar ke file, persegi panjang tidak akan disimpan. Apakah ada cara agar persegi panjang menggantikan nilai piksel pada gambar? Terima kasih lagi!
Yanfeng Liu
Lupakan. Saya menemukan tautan ini dan sepertinya berfungsi
:)
Jika Anda masih mendapatkan persegi panjang terisi, berikan fill=Falsebendera keRectangle
Ivan Talalaev
7
Ini aneh. Dokumentasi untuk patches.Rectanglemengatakan bahwa dua angka pertama adalah The bottom and left rectangle coordinates. Saya melihat di sini bahwa dua angka pertama, (50.100), sesuai dengan TOP dan koordinat kiri persegi panjang. Saya bingung.
Monica Heddneck
1
Tidak, persegi panjang ada di tempat yang tepat. Ada dalam koordinat data. Anda dapat mengubah transformasi jika Anda menginginkannya dalam koordinat sumbu
tmdavison
20

Anda perlu menggunakan tambalan.

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')
Ketenangan
sumber
Saya menyukai bagaimana Anda merangkum sumbu dalam objek gambar: sumbu melakukan ploting, figur melakukan antarmuka tingkat tinggi
Alex
19

Tidak perlu untuk subplot, dan pyplot dapat menampilkan gambar PIL, jadi ini dapat disederhanakan lebih lanjut:

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)

Atau, versi singkat:

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
sumber
7

Dari matplotlib pemahaman saya adalah perpustakaan merencanakan.

Jika Anda ingin mengubah data gambar (misalnya menggambar persegi panjang pada gambar), Anda bisa menggunakan ImageDraw , OpenCV dari PIL , atau sesuatu yang serupa .

Berikut adalah metode ImageDraw PIL untuk menggambar persegi panjang .

Berikut adalah salah satu metode OpenCV untuk menggambar persegi panjang .

Pertanyaan Anda bertanya tentang Matplotlib, tetapi mungkin seharusnya hanya bertanya tentang menggambar persegi panjang pada gambar.

Berikut adalah pertanyaan lain yang membahas apa yang menurut Anda ingin Anda ketahui: Gambarlah persegi panjang dan teks di dalamnya menggunakan PIL

pengguna3731622
sumber