Сегментация изображения в 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()
функция..