如何删除二进制图像中未闭合的曲线?

flo*_*ree 5 opencv

经过一些处理,我有这个二进制图像:

在此输入图像描述

我想删除未闭合的曲线,即左上角和右下角曲线.你能建议我做这个的算法吗?谢谢.

fra*_*xel 7

正如@John Zwinck所提到的那样可以使用floodfill,但我想你的问题是你想要回到原始的黑色背景,并保留封闭形状的轮廓.虽然您可以用来contours解决这个问题,但这是一个相当简单的方法,它将从图像中删除所有非闭合和未闭合的线段,即使它们附着到闭合的形状,但保留闭合曲线的边缘.

  1. 具有白色的填充图像 - 这将删除您的问题非闭合线,还会删除所需对象的边框.
  2. 侵蚀图像,然后反转它
  3. 和原始图像的图像 - 从而恢复边界.

输出:

在此输入图像描述

代码是在python中,但应该很容易转换为通常的C++ cv2用法.

import cv2
import numpy as np

im = cv2.imread('I7qZP.png',cv2.CV_LOAD_IMAGE_GRAYSCALE)
im2 = im.copy()
mask = np.zeros((np.array(im.shape)+2), np.uint8)
cv2.floodFill(im, mask, (0,0), (255))
im = cv2.erode(im, np.ones((3,3)))
im = cv2.bitwise_not(im)
im = cv2.bitwise_and(im,im2)
cv2.imshow('show', im)
cv2.imwrite('fin.png',im)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)