python - openCV 中的图像分割

标签 python opencv image-processing opencv-python

我有一张路的图片。

我对其应用颜色阈值并得到一个黄色和白色标记的掩码 (cv2.inRange)

然后我在蒙版上应用了特定区域的轮廓来去除噪声(cv2.findContours)

我得到了很好的面具,其中白色为泳道,其他地方为黑色。

但是,我无法将三个车道放入单独的数组中 - 我尝试了分水岭算法,它给出了车道的边界,但没有将它们分成不同的数组。

我想要的结果是拥有三个独立的数组,每个数组包含每条车道的所有像素编号。

我也扭曲了图像。

下面的屏幕截图是蒙版和原始扭曲图像的按位与。

enter image description here

最佳答案

您可以找到轮廓并填充它们并用作蒙版。 要查找轮廓,您可以使用 cv2.findContours() OpenCV 中的函数。您可以在 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 以创建掩码。

修改

首先确保所有黑色区域在rgb 值中都是(0, 0, 0)。然后你可以试试 here 中的值对于 here 中的第二个参数和值findContours() 函数的第三个参数..

关于python - openCV 中的图像分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50945444/

相关文章:

c++ - 在 Cygwin 上使用 CMake 编译 OpenCV 项目,为 Windows 安装 OpenCV

python - 类型错误 : object() takes no parameters after defining __new__

python - 为什么 gensim Doc2Vec 为同一个句子提供不同的向量?

python - Django 内存泄漏 : possible causes?

c# - 如何将 .NET 图像或字节数组转换为 Emgu.CV.Image<Emgu.CV.Structure.Bgr , byte >

python - 在python中 reshape 图像矩阵

c# - 如何从 Controller 方法返回多个图像?

python - 将 OpenCV 图像转换为黑白图像

c++ - 如何在 C++ 中使用 OpenCV 检测多个对象?

python - 仅检查 OpenCV 中视频源的特定部分