Извлечение отмеченных областей на изображении с помощью прямоугольников одинакового размера - PullRequest
0 голосов
/ 01 апреля 2020

Я хочу выделить одну или несколько областей изображения, которые отмечены на изображении произвольной формой (края формы всегда имеют один и тот же цвет - красный). Все отмеченные области имеют примерно одинаковый размер (а не точно), и я хотел бы, чтобы вырезанные прямоугольники имели одинаковый размер результата.

Можете ли вы дать мне подсказку, как это сделать? Я думаю, что можно использовать opencv для этой задачи в python, но я не знаком с этим, так что спасибо за вашу помощь!

edit: добавлен пример изображения, целью было бы извлечь красный площади прямоугольниками одинакового размера. example image

1 Ответ

1 голос
/ 01 апреля 2020

Вот один из способов сделать это в Python / OpenCV.

  • Считать серый ввод с нарисованными красными фигурами
  • Порог для красного цвета фигур
  • Применить морфологию близко, чтобы убедиться, что фигуры являются непрерывными контурами без пропусков
  • Получить внешние контуры и их ограничивающие рамки
  • Вычислить центры каждого ограничивающего прямоугольника и сохранить в списке, а также максимум ширина и высота всех ограничивающих рамок.
  • Для каждого центра и максимальной ширины и высоты обрежьте входное изображение и сохраните

Ввод:

enter image description here

import cv2
import numpy as np

# read image
img = cv2.imread('monet_shapes.png')

# threshold on red regions
lowerBound = np.array([0, 0, 150]);
upperBound = np.array([100, 100, 255]);
thresh = cv2.inRange(img, lowerBound, upperBound);

# apply morphology to ensure regions are continuous outlines and no gaps
kernel = np.ones((9,9), np.uint8)
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)    

# get external contours
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
wmax = 0
hmax = 0
# get bounding boxes and max width and max height from all boxes and centers
centers = []
for cntr in contours:
    # get bounding boxes
    x,y,w,h = cv2.boundingRect(cntr)
    cx = x + w // 2
    cy = y + h // 2
    cent = [cx,cy]
    centers.append(cent)
    if w > wmax:
        wmax = w
    if h > hmax:
        hmax = h

print(wmax,hmax)

# show thresh and result    
cv2.imshow("thresh", thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

# save threshold
cv2.imwrite("monet_shapes_thresh.png",thresh)

# crop bounding boxes of size maxw, maxh about centers and save
i = 1
for cent in centers:
    cx = cent[0]
    cy = cent[1]    
    box = img[cy-hmax//2:cy+hmax//2, cx-wmax//2:cx+wmax//2]
    cv2.imwrite("blackbox_result_{0}.png".format(i),box)
    i = i + 1


Пороговое изображение:

enter image description here

Результирующие 5 областей обрезки:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...