openCV 中的图像分割
Image Segmentation in openCV
我有一张路的图片。
我对其应用了颜色阈值处理,得到了一个黄色和白色标记的蒙版 (cv2.inRange
)
然后我在蒙版上应用了特定区域的轮廓来去除噪声(cv2.findContours
)
我得到了很好的面具,白色是车道,其他地方都是黑色。
但是,我无法将三个车道放入单独的数组中 - 我尝试了 watershed 算法,它给出了车道的边界,但是没有将它们分成不同的数组.
我想要的结果是拥有三个独立的数组,每个数组包含每条车道的所有像素编号。
我也扭曲了图像。
下面的屏幕截图是蒙版和原始扭曲图像的按位与。
您可以找到轮廓并填充它们并用作蒙版。
要查找轮廓,您可以使用 cv2.findContours()
function in OpenCV
. You can find an example in OpenCV Docs.
正如在文档中一样,您可以通过
获得轮廓
_, contours, _ = cv2.findContours(your_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
变量contours
将有一个等高线列表。在您的情况下,每条车道将作为单独的轮廓添加。
然后按照this答案中的描述,您可以创建蒙版。
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
值。然后你可以尝试 here for the second argument and values in here 中的值作为 findContours()
函数的第三个参数..
我有一张路的图片。
我对其应用了颜色阈值处理,得到了一个黄色和白色标记的蒙版 (cv2.inRange
)
然后我在蒙版上应用了特定区域的轮廓来去除噪声(cv2.findContours
)
我得到了很好的面具,白色是车道,其他地方都是黑色。
但是,我无法将三个车道放入单独的数组中 - 我尝试了 watershed 算法,它给出了车道的边界,但是没有将它们分成不同的数组.
我想要的结果是拥有三个独立的数组,每个数组包含每条车道的所有像素编号。
我也扭曲了图像。
下面的屏幕截图是蒙版和原始扭曲图像的按位与。
您可以找到轮廓并填充它们并用作蒙版。
要查找轮廓,您可以使用 cv2.findContours()
function in OpenCV
. You can find an example in OpenCV Docs.
正如在文档中一样,您可以通过
_, contours, _ = cv2.findContours(your_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
变量contours
将有一个等高线列表。在您的情况下,每条车道将作为单独的轮廓添加。
然后按照this答案中的描述,您可以创建蒙版。
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
值。然后你可以尝试 here for the second argument and values in here 中的值作为 findContours()
函数的第三个参数..