Opencv - 关闭特定轮廓

Opencv - Close a specific contour

我正在处理一张图片,需要你的帮助。经过大量图像处理后,我从显微图像中得到了这个。这是我的预决赛阈值图像:

如您所见,左上角有一个很大的C。这不应该是一个开放的 blob,它必须是一个封闭的。

如何在不修改其余部分的情况下实现这一点?我正在考虑将 Convex Hull 应用到那个轮廓,但我不知道如何只应用那个轮廓,甚至不触及其他轮廓

我的意思是,也许有一个 "meassure" 我可以用来将这个轮廓与其他轮廓隔离开来。也许是一种告诉 convex/cancave 它有多大或它划定的 "hole" 有多大的方法。

在进一步的工作中可能会出现一些其他未闭合的轮廓,我需要关闭它们,所以不要把它集中在这个特殊情况下,我需要一些我可以使用或适应其他类似情况的东西。

提前致谢!

我有办法。

首先,我在你给的阈值图像上找到并绘制了轮廓。

在图像中,我发现第 29 个轮廓是带有 C 的轮廓。因此,我用黑色为第 29 个轮廓之外的每个轮廓着色。只有 C 的轮廓是白色的。

代码:

#---- finding all contours
contours, iji = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

#---- Turning all contours black
cv2.drawContours(im1, contours, -1, (0,0,0), -1)

#---- Turning contour of interest alone white
cv2.drawContours(im1, contours, 29, (255, 255, 255), -1)

剩下你感兴趣的 blob

分离出所需的 blob 后,我使用椭圆核执行了一定次数的迭代的形态闭合。

#---- k = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(30,30))
#---- closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, k)
#---- cv2.imshow("closed_img", closing)

球现在在你的球场上!我也学到了一些东西!玩得开心。

虽然 Jeru 的答案在你想要关闭轮廓的部分是正确的,但我认为 OP 也想知道他如何自动识别 "C" 斑点而不必找出手动这就是第 29 个轮廓。

因此,我提出了一种识别它的方法:计算每个形状的质心,并检查这个质心是否在形状内部。斑点(圆圈)应该是这种情况,但 "C"s.

img=cv2.imread(your_image,0)
if img is None:
     sys.exit("No input image") #good practice
res=np.copy(img) #just for visualisation purposes    

#finding the connectedComponents (each blob)
output=cv2.connectedComponentsWithStats(img,8)
#centroid is sort of the "center of mass" of the object.
centroids=output[3]
#taking out the background
centroids=centroids[1:]


#for each centroid, check if it is inside the object
for centroid in centroids:
    if(img[int(centroid[1]),int(centroid[0])]==0):
        print(centroid) 
        #save it somewhere, then do what Jeru Luke proposes

    #an image with the centroids to visualize
    res[int(centroid[1]), int(centroid[0])]=100

这适用于您的代码(我试过了),但需要注意的是,可能不适用于每个 "C form",特别是如果它们是 "fatter",因为它们的质心很可能在它们内部。我认为可能有你所说的更好的凸性度量,至少寻找这样的度量对我来说似乎是正确的方向。

也许您可以尝试在所有对象上计算 ConvexHull(不修改输入图像),而不是测量对象面积与 "convex hull around it" 面积之间的比率,如果该比率低于某个阈值然后将其分类为 "C" 形状并相应地修改它。