Сегментация изображения в openCV

У меня есть образ дороги.

Я применил к нему цветовой порог и получил маску из желтых и белых маркеров (cv2.inRange)

Затем я применил получившиеся контуры определенной области на маске, чтобы убрать шум (cv2.findContours)

Я получил хорошую маску с белыми полосами и черными везде.

Тем не менее, я не могу получить три дорожки в отдельных массивах - я попробовал алгоритм водораздела, он дает мне границы дорожек, но не разделяет их на разные массивы.

Мой желаемый результат - иметь три отдельных массива, каждый из которых содержит все номера пикселей каждой полосы.

Я также исказил изображение.

скриншот ниже - побитовый, с маской и оригинальным искаженным изображением.

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

1 ответ

Решение

Вы можете найти контуры и заполнить их и использовать в качестве масок. Чтобы найти контуры, вы можете использовать cv2.findContours() функция в OpenCV, Вы можете найти пример в OpenCV Docs.
Как и в документах, вы можете получить контуры,

_, contours, _ = cv2.findContours(your_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

Переменная contours будет иметь список контуров. В вашем случае каждая полоса будет добавлена ​​в виде отдельных контуров.

Затем, как описано в этом ответе, вы можете создавать маски.

masks = []
for contour in contours:
    img = np.zeros( (height, width) ) 
    cv2.fillPoly(img, pts =[contours], color=(255,255,255))
    masks.append(img)

А также вы можете использовать cv2.drawContours функция, набор thickness=cv2.FILLED создать маски.

модификация

Сначала убедитесь, что все черные области (0, 0, 0) в rgb ценности. Затем вы можете попробовать значения здесь для второго аргумента и значения здесь для третьего аргумента findContours() функция..

Другие вопросы по тегам