如何在像素簇周围创建一个封闭区域?

时间:2019-04-30 16:02:28

标签: python image-processing polygon mask

我正在用Python 3.5.2做一些图像处理。完成一些工作后,我使用了支持向量机(用作按像素分类任务)对图像进行了分割和图像处理。如训练后所预期的那样,当我尝试预测新图像时,我得到了一些像素错误标记的信息。我只需要为细分进行分类,这样结果就可以作为蒙版,在所需区域中为 1 ,在其他区域为 0

预测的蒙版示例如下:

one

编辑: 这是此图像的链接(使用cv2.imwrite()保存):

https://i.ibb.co/74nxLvZ/img.jpg


如您所见,其中有一个很大的区域带有一些孔,这意味着它们是假阴性(FN)像素预测。此外,在该大区域之外还有一些假阳性(FP)像素。

我希望能够为那个大区域单独准备一个口罩并装满。因此,我一直在考虑使用诸如 DBSCAN K-means 之类的聚类方法在这些数据点上创建聚类,希望能为大区域获取聚类。您对此事有什么建议吗?

现在,假设我有那个集群。我如何才能填补大区域的空缺。我想在那个大区域周围创建某种图形/多边形/ ROI,然后将所有像素放入其中。有人可以阐明如何实现这一目标吗?

我会以某种方式想要这样的东西:

two

希望我能说清楚。如果我不是在评论中让我知道。希望有人可以帮助我解决这个问题。

预先感谢

1 个答案:

答案 0 :(得分:1)

实际上,您可以使用DBSCAN对数据点进行聚类。特别是当您不知道要获取的群集数量时。

然后,您可以获取要填充的区域的轮廓。在这种情况下,带有孔的白色大区域。

# im_gray: is the binary image you have
cnt, _ = cv2.findContours(im_gray, mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_NONE)

您可以遍历cnt以选择正确的轮廓。然后,假设您“知道”所需的轮廓,则可以使用 OpenCV

中的功能cv2.approxPolyDP()

取自OpenCV tutorial

  

将轮廓形状近似为顶点数量较少的其他形状   根据我们指定的精度。它是Douglas-Peucker的实现   算法。

epsilon = 0.001
approxPoly= cv2.approxPolyDP(np.array(maxPoly), epsilon, closed=True)

epsilon是一个精度参数,它是轮廓到近似轮廓的最大距离。根据文档(上面的链接)中的建议,您可以使用epsilon=0.1*cv2.arcLength(cnt,True)。在这种情况下,我使用了值0.001

一旦有了这个,就可以绘制:

poligon_mask = np.zeros(im_gray.shape)
poligon_mask = cv2.drawContours(max_poligon_mask, [approxPoly], cv2.FILLED, (255), -1)

希望这会有所帮助。