Найти контур нескольких объектов с их отверстиями - PullRequest
0 голосов
/ 21 ноября 2019

Это следующий вопрос из: Как получить граничные координаты бинарной маски с отверстиями?

Учитывая то же изображение:

enter image description here

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

import matplotlib.pyplot as plt # For plotting
import cv2
from skimage import io         # Only needed for web grabbing images, use cv2.imread for local images


# Read image; find contours with hierarchy
blob = io.imread('https://i.stack.imgur.com/Ga5Pe.png')
contours, hier = cv2.findContours(blob, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# Define sufficient enough colors for blobs
colors = [(255, 0, 0), (0, 255, 0), (0, 0, 255)]

# Draw all contours, and their children, with different colors
out = cv2.cvtColor(blob, cv2.COLOR_GRAY2BGR)
# Check if it's the outer contour
k = -1
# Preallocate list
obj_list = []

for i, cnt in enumerate(contours):
    if (hier[0, i, 3] == -1):
        k += 1
    # cv2.drawContours(out, [cnt], -1, colors[k], 2)
    # Add contour list to object list if it is an inner contour
    obj_list.extend([cnt])

    # Concatenate array in list    
    obj_list = np.vstack(obj_list)    
    obj_list = np.squeeze(obj_list)   
    x = obj_list[:,0].tolist()    
    y = obj_list[:,1].tolist()


cv2.imshow('out', out)
cv2.waitKey(0)
cv2.destroyAllWindows()

РЕДАКТИРОВАТЬ: Принятый ответ работает только с объектами с внутреннимконтуры но не для объектов без. Я попытался исправить это, добавив следующий код:

# Add inner contours of blob to list
cnt_idx = np.squeeze(np.where(hier[0, :, 3] == b_idx))
c_cnt_idx = np.array(cnt_idx)
if c_cnt_idx.size > 0:
    cnt_idx = b_idx

, но получил следующее сообщение об ошибке:

ValueError: Итерация операндов нулевого размера не включена

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