Opencv - 关闭特定轮廓

时间:2017-01-20 05:51:08

标签: opencv image-processing convex-hull opencv-contour

我正在处理图像,我需要你的帮助。经过大量的图像处理后,我从微观图像中得到了这一点。这是我的最终阈值图像:

unclosed contour

你可以看到左上角有一个很大的 C 。这不应该是一个开放的blob,它必须是一个封闭的。

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

我的意思是,也许有一个" meassure"我可以用它来隔离这个轮廓。也许是一种方法来判断它是多么凸/凹,或者有多大#34;孔"划界。

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

提前致谢!

2 个答案:

答案 0 :(得分:2)

虽然Jeru的答案在您想要关闭轮廓的部分是正确的,但我认为OP也想知道他如何能够自动识别“C”blob而无需手动找出它就是第29轮。

因此,我提出了一种识别它的方法:计算每个形状的质心并检查这个质心是否在形状内。它应该是blob(圆圈)的情况,而不是“C”的情况。

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形式”,特别是如果它们“更胖”,因为它们的质心很可能在它们内部。我认为,正如你所说,可能有一个更好的凸度衡量标准,至少寻找这样的衡量标准对我来说似乎是正确的方向。

也许您可以尝试在所有物体上计算ConvexHull(不修改输入图像),而不是测量物体区域与“它周围的凸包”区域之间的比例,如果该比率低于某个阈值然后你将它分类为“C”形状并相应地修改它。

答案 1 :(得分:1)

我有一个解决方案。

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

在图像中,我发现第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

enter image description here

隔离了所需的blob后,我使用椭圆内核进行形态学闭合一定次数的迭代。

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

enter image description here

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