способ объединить пересекающиеся ограничивающие прямоугольники в PYTHON? - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь упростить следующее изображение с помощью OpenCV:

enter image description here

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

Под пересечением я имею в виду также касание.Надеюсь, что это на 100% ясно:

enter image description here

1 Ответ

0 голосов
/ 19 марта 2019

Сначала вы должны использовать cv2.RETR_EXTERNAL вместо cv2.RETR_TREE в методе findContours() следующим образом: cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
Это приведет к появлению только внешних блоков, а не меньших внутри.

Чтобы объединить оставшиеся перекрывающиеся контуры, вы можете сделать новое черное изображение, нарисовав все контуры на нем, закрашенные белым. Затем выполните новый findContours. Ограничительная рамка найденных контуров объединит все контуры, которые перекрываются / соприкасаются.

Код выглядит так:

# find contours in image
im, contours, hierarchy = cv2.findContours(thresholded_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# create black image to use as mask
mask = np.zeros(thresholded_image.shape[:2], dtype=np.int8)
for cnt in contours:
    # get the bounding box of the contour and draw the rect on image
    (x,y,w,h) = cv2.boundingRect(cnt)
    # draw the shape filled on the new mask
    cv2.rectangle(mask ,(x,y,), (x+w,y+h),(255),-1)
# find contours in mask to get 
im2, contours2, hierarchy2 = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# draw contours
for cnt in contours2:
    # get the bounding box of the contour and draw the rect on image
    (x,y,w,h) = cv2.boundingRect(cnt)
    # draw the boundingbox on your image
    cv2.drawContours(image, [cnt], 0, (255,0,0), 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...