matplotlib: วิธีวาดรูปสี่เหลี่ยมผืนผ้าบนภาพ


159

วิธีวาดรูปสี่เหลี่ยมผืนผ้าบนรูปภาพดังนี้: ป้อนคำอธิบายภาพที่นี่

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)

ไม่รู้จะดำเนินการอย่างไร

คำตอบ:


275

คุณสามารถเพิ่มRectangleโปรแกรมแก้ไขให้กับแกน matplotlib

ตัวอย่างเช่น (โดยใช้ภาพจากบทช่วยสอนที่นี่ ):

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

ป้อนคำอธิบายภาพที่นี่


ขอบคุณสำหรับคำตอบ! ใช้งานได้ แต่ดูเหมือนว่ารูปสี่เหลี่ยมผืนผ้าจะถูกวาดบนแกนไม่ใช่รูปภาพ หากฉันพยายามบันทึกภาพลงในไฟล์รูปสี่เหลี่ยมผืนผ้าจะไม่ถูกบันทึก มีวิธีที่ทำให้สี่เหลี่ยมผืนผ้าแทนที่ค่าพิกเซลบนรูปภาพหรือไม่? ขอบคุณอีกครั้ง!
Yanfeng Liu

ไม่เป็นไร. ฉันพบลิงค์นี้และดูเหมือนว่าจะใช้งานได้
:)

หากคุณยังคงได้รับรูปสี่เหลี่ยมผืนผ้าเต็มรูปแบบให้ส่ง fill=FalseแฟRectangle
ล็ก

7
นี่เป็นเรื่องแปลก เอกสารสำหรับการบอกว่าหมายเลขสองครั้งแรกpatches.Rectangle The bottom and left rectangle coordinatesฉันเห็นที่นี่ว่าตัวเลขสองตัวแรก (50,100) ตรงกับพิกัดด้านบนและด้านซ้ายของสี่เหลี่ยม ฉันสับสน
Monica Heddneck

3
ไม่สี่เหลี่ยมผืนผ้าอยู่ในตำแหน่งที่ถูกต้อง อยู่ในพิกัดข้อมูล คุณสามารถเปลี่ยนการแปลงได้หากต้องการในพิกัดแกน
tmdavison

24

ไม่จำเป็นต้องมีพล็อตย่อยและ pyplot สามารถแสดงภาพ PIL ได้ดังนั้นจึงสามารถทำให้ง่ายขึ้นได้:

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)

หรือรุ่นสั้น:

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

23

คุณต้องใช้แพทช์

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

1
ฉันชอบวิธีที่คุณห่อหุ้มแกนไว้ในวัตถุรูป: แกนทำการพล็อตรูปทำสิ่งที่ติดต่อระดับสูง
Alex

7

จากความเข้าใจของฉันmatplotlibคือไลบรารีการวางแผน

หากคุณต้องการเปลี่ยนข้อมูลรูปภาพ (เช่นวาดรูปสี่เหลี่ยมผืนผ้าบนรูปภาพ) คุณสามารถใช้ImageDraw ของ PIL , OpenCVหรือสิ่งที่คล้ายกัน

นี่คือวิธีการ ImageDraw PIL ของการวาดรูปสี่เหลี่ยมผืนผ้า

นี่คือหนึ่งในวิธีการของ OpenCV สำหรับการวาดรูปสี่เหลี่ยมผืนผ้า

คำถามของคุณถามเกี่ยวกับ Matplotlib แต่น่าจะเพิ่งถามเกี่ยวกับการวาดสี่เหลี่ยมผืนผ้าบนรูปภาพ

นี่คือคำถามอีกข้อหนึ่งที่กล่าวถึงสิ่งที่ฉันคิดว่าคุณอยากรู้: วาดรูปสี่เหลี่ยมผืนผ้าและข้อความโดยใช้ PIL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.