matplotlib: làm thế nào để vẽ một hình chữ nhật trên hình ảnh


139

Cách vẽ hình chữ nhật trên một hình ảnh, như thế này: nhập mô tả hình ảnh ở đây

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)

Tôi không biết làm thế nào để tiến hành.

Câu trả lời:


250

Bạn có thể thêm một Rectanglebản vá vào các trục matplotlib.

Ví dụ: (sử dụng hình ảnh từ hướng dẫn ở đây ):

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

nhập mô tả hình ảnh ở đây


Cảm ơn câu trả lời của bạn! Nó hoạt động, nhưng có vẻ như hình chữ nhật được vẽ trên trục chứ không phải hình ảnh. Nếu tôi cố lưu hình ảnh vào một tệp, hình chữ nhật sẽ không được lưu. Có cách nào để hình chữ nhật thay thế các giá trị pixel trên ảnh không? Cảm ơn một lần nữa!
Yanfeng Liu

Đừng bận tâm. Tôi tìm thấy liên kết này và nó dường như đang hoạt động :)
Yanfeng Liu

Nếu bạn vẫn nhận được hình chữ nhật đầy, hãy chuyển fill=Falsecờ đếnRectangle
Ivan Talalaev

7
Điều này thật kỳ lạ. Các tài liệu cho patches.Rectanglebiết rằng hai số đầu tiên là The bottom and left rectangle coordinates. Tôi thấy ở đây hai số đầu tiên, (50.100), tương ứng với tọa độ TOP và trái của hình chữ nhật. Tôi bối rối.
Monica Heddneck

1
Không, hình chữ nhật ở đúng nơi. Đó là tọa độ dữ liệu. Bạn có thể thay đổi biến đổi nếu bạn muốn nó trong tọa độ trục
tmdavison

20

Bạn cần sử dụng các bản vá.

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

Tôi thích cách bạn đóng gói các trục trong một đối tượng hình: các trục thực hiện âm mưu, hình thực hiện công cụ giao diện cấp cao
Alex

19

Không cần subplots và pyplot có thể hiển thị hình ảnh PIL, vì vậy điều này có thể được đơn giản hóa hơn nữa:

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)

Hoặc, phiên bản ngắn:

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

Từ sự hiểu biết của tôi matplotlib là một thư viện âm mưu.

Nếu bạn muốn thay đổi dữ liệu hình ảnh (ví dụ: vẽ hình chữ nhật trên hình ảnh), bạn có thể sử dụng ImageDraw , OpenCV của PIL hoặc một cái gì đó tương tự.

Dưới đây là phương pháp ImageDraw của PIL để vẽ hình chữ nhật .

Đây là một trong những phương pháp của OpenCV để vẽ hình chữ nhật .

Câu hỏi của bạn hỏi về Matplotlib, nhưng có lẽ nên hỏi về việc vẽ một hình chữ nhật trên một hình ảnh.

Đây là một câu hỏi khác giải quyết những gì tôi nghĩ bạn muốn biết: Vẽ một hình chữ nhật và một văn bản trong đó bằng PIL

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.