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

How to create a closed region around cluster of pixels?

我正在 Python 3.5.2 中进行一些图像处理。经过一些工作后,我使用 支持向量机 进行了分割和成像(用作逐像素分类任务)。正如训练后预期的那样,当我尝试预测新图像时,我得到了一些错误标记的像素。我只需要 类 进行分割,因此结果将作为掩码使用 1 在所需区域和 0 其他地方。

预测掩码示例如下所示:

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

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


如您所见,有一个很大的区域,里面有一些洞,这意味着它们是 假阴性 (FN) 像素预测。此外,在那个大区域之外还有一些 误报 (FP) 像素。

我希望能够单独为那个大区域获得一个面具并填充。因此,我一直在考虑使用一些聚类方法,如 DBSCANK-means 在这个数据点上创建聚类,希望得到一个聚类大区域。您对此有何建议?

现在,假设我有那个集群。我怎样才能填补大区域的漏洞。我想在那个大区域周围创建某种 figure/polygon/roi,然后将所有像素都放在里面。谁能阐明如何实现这一目标?

不知何故我想要这样的东西:

希望我说清楚了。如果我没有在评论中告诉我。希望有人能帮我解决这个问题。

提前致谢

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

然后,就可以得到想要填充的区域的轮廓了。在这种情况下,带有孔的大白色区域。

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

您可以循环 cnt 到 select 正确的轮廓。然后,假设你 "know" 你想要的轮廓,你可以使用 OpenCV

中的函数 cv2.approxPolyDP()

取自OpenCV tutorial

It approximates a contour shape to another shape with less number of vertices depending upon the precision we specify. It is an implementation of Douglas-Peucker algorithm.

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

epsilon是一个精度参数,它是从轮廓到近似轮廓的最大距离。正如文档(上面的 link)中所建议的,您可以使用 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)

希望这对您有所帮助。