使用OpenCV查找没有狭窄瓶颈的连续区域

时间:2017-01-02 19:09:55

标签: c++ opencv opencv3.1

我希望获得连续区域的轮廓,但输出中没有非常狭窄的位置。

输入图像可能看起来像此图像(应用阈值后):Input image

通过调用OpenCVs findContours方法,我得到以下结果:Actual output

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

是否可以告诉OpenCV(findContours)最小厚度"该地区?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在进行findContours之前,使用侵蚀,然后使用小内核进行扩张。 OpenCV中有一种特殊的运算符就是这样,称为Opening morphologyEx

这样的事情应该有效:

morphologyEx(src, dst, MORPH_OPEN, Mat());
相关问题