2017-01-02 72 views
0

窄的瓶颈连续的区域我想要得到的轮廓的不断区,但不必在输出非常狭窄的地方。查找不使用OpenCV的

输入图像可以是这样的图像(应用阈值之后):Input image

通过打电话只是OpenCVs findContours方法,我得到以下结果:Actual output

我的问题是,我不希望在结果中具有窄(白色)峰。只是模糊图像将不起作用,因为我不能包括黑色峰。所以想要的输出应该看起来像这条绿线:Ideal output

是否有可能告诉OpenCV(findContours)该区域的最小“厚度”?

+0

你为什么不使用[形态学操作(http://docs.opencv.org/trunk/d9/d61/tutorial_py_morphological_ops.html)至摆脱那些? –

回答

1

Erosion可以看作添加边界像素的背景。因此,它在您的输入中摆脱了这些狭窄的部分。但是,由于它扭曲了所有边界,所以之后需要应用dilation,以消除侵蚀对实际边界的影响。侵蚀+膨胀过程被称为opening

下面的代码部分产生期望的输出。根据您的图像大小,使用k_size进行播放。然后申请findContours

# Read and binarize the image 
image = cv2.imread("test.png",cv2.IMREAD_GRAYSCALE) 
ret, im_th =cv2.threshold(image,150,255,cv2.THRESH_BINARY) 

# Set the kernel and perform opening 
k_size = 7 
kernel = np.ones((k_size,k_size),np.uint8) 
opened = cv2.morphologyEx(im_th, cv2.MORPH_OPEN, kernel) 
cv2.imwrite("opened.png", opened) 

输出:

Opened output with no islands

+0

谢谢,您的解决方案完美无缺! – wessnerj

0

使用腐蚀,然后用扩张小仁你做findContours之前。有一个在OpenCV的一种特殊的经营者,不只是说,叫OpeningmorphologyEx

像这样的东西应该工作:

morphologyEx(src, dst, MORPH_OPEN, Mat());