matplotlib: как нарисовать прямоугольник на изображении

139

Как нарисовать прямоугольник на изображении, например: введите описание изображения здесь

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)

Я не знаю, как поступить.

КАЙ ЖАО
источник

Ответы:

251

Вы можете добавить 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()

введите описание изображения здесь

tmdavison
источник
Спасибо за Ваш ответ! Работает, но кажется, что по оси нарисован прямоугольник, а не сама картинка. Если я попытаюсь сохранить изображение в файл, прямоугольник не будет сохранен. Есть ли способ, чтобы прямоугольник заменял значения пикселей на изображении? Еще раз спасибо!
Янфэн Лю
Неважно. Я нашел эту ссылку , и это , кажется, работает:)
Yanfeng Лю
Если у вас все еще появляется заполненный прямоугольник, передайте fill=FalseфлагRectangle
Иван Талалаев
7
Это странно В документации patches.Rectangleуказано, что первые два числа - это The bottom and left rectangle coordinates. Я вижу здесь, что первые два числа (50,100) соответствуют верхней и левой координате прямоугольника. Я запутался.
Monica Heddneck
1
Нет, прямоугольник в нужном месте. Это в координатах данных. Вы можете изменить преобразование, если хотите, в координатах осей
tmdavison
20

Вам нужны патчи.

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')
безмятежность
источник
Мне понравилось, как вы инкапсулируете оси в объект-фигуру: оси делают построение, фигура выполняет интерфейс высокого уровня
Алекс
19

Нет необходимости в подзаголовках, и 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'))
Джеймс 'Пушистый' Бертон
источник
7

Насколько я понимаю, matplotlib - это библиотека для построения графиков.

Если вы хотите изменить данные изображения (например, нарисовать прямоугольник на изображении), вы можете использовать PIL ImageDraw , OpenCV или что-то подобное.

Вот метод ImageDraw PIL для рисования прямоугольника .

Вот один из методов OpenCV для рисования прямоугольника .

Ваш вопрос задан о Matplotlib, но, вероятно, нужно было просто спросить о рисовании прямоугольника на изображении.

Вот еще один вопрос, который касается того, что, я думаю, вы хотели знать: нарисуйте прямоугольник и текст в нем с помощью PIL.

user3731622
источник