我正在用Python 3.5.2做一些图像处理。完成一些工作后,我使用了支持向量机(用作按像素分类任务)对图像进行了分割和图像处理。如训练后所预期的那样,当我尝试预测新图像时,我得到了一些像素错误标记的信息。我只需要为细分进行分类,这样结果就可以作为蒙版,在所需区域中为 1 ,在其他区域为 0 。
预测的蒙版示例如下:
编辑:
这是此图像的链接(使用cv2.imwrite()
保存):
https://i.ibb.co/74nxLvZ/img.jpg
如您所见,其中有一个很大的区域带有一些孔,这意味着它们是假阴性(FN)像素预测。此外,在该大区域之外还有一些假阳性(FP)像素。
我希望能够为那个大区域单独准备一个口罩并装满。因此,我一直在考虑使用诸如 DBSCAN 或 K-means 之类的聚类方法在这些数据点上创建聚类,希望能为大区域获取聚类。您对此事有什么建议吗?
现在,假设我有那个集群。我如何才能填补大区域的空缺。我想在那个大区域周围创建某种图形/多边形/ ROI,然后将所有像素放入其中。有人可以阐明如何实现这一目标吗?
我会以某种方式想要这样的东西:
希望我能说清楚。如果我不是在评论中让我知道。希望有人可以帮助我解决这个问题。
预先感谢
答案 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()
将轮廓形状近似为顶点数量较少的其他形状 根据我们指定的精度。它是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)
希望这会有所帮助。