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

标签 c++ opencv opencv3.1

我想获得连续区域的轮廓,但输出中没有非常狭窄的地方。

输入图像可能类似于此图像(应用阈值后):Input image

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

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

是否可以告诉 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)

输出:

Opened output with no islands

关于c++ - 使用 OpenCV 找到没有狭窄瓶颈的连续区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41432128/

相关文章:

C++ 将 wstringstream 传递给另一个函数

c++ - OpenCV:访问 5D 矩阵的元素

java - OpenCV 和 Android Studio : "unfortunately app has stopped"

android - 如果我使用的是 OpenCV 管理器,是否需要将 OpenCV native JNI 库复制到 jniLibs 目录?

c++ - UDP 多播不适用于 linux Debian

c++ - 更高效的对象交换与对象内部的大量数据容器

c++ - union 的内存对齐问题

android - Renderscript Colormatrix内部函数-帮助我理解

python - 如何将 OpenCV 图像提供给 Python 中经过训练的 CNN 模型(添加新维度)?

python - 使用 OpenCV 检测彩色圆圈及其中心