我想获取连续区域的轮廓,但是在输出中不要有非常狭窄的位置。

输入图像看起来像此图像(应用阈值后):c++ - 使用OpenCV查找没有狭窄瓶颈的连续区域-LMLPHP

通过仅调用OpenCVs findContours方法,我得到以下结果:c++ - 使用OpenCV查找没有狭窄瓶颈的连续区域-LMLPHP

我的问题是我不想在结果中出现狭窄的(白色)峰。仅模糊图像是行不通的,因为我不能包括黑峰。因此,所需的输出应类似于此绿线:c++ - 使用OpenCV查找没有狭窄瓶颈的连续区域-LMLPHP

是否可以告知OpenCV(findContours)该区域的最小“厚度”?

最佳答案

Erosion可以认为是将边界像素添加到背景中。因此,它消除了输入中的狭窄部分。但是,由于它扭曲了所有边界,因此您需要在以后应用dilation,以消除腐 eclipse 对实际边界的影响。腐 eclipse +膨胀过程称为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)

输出:

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

10-08 17:22