Python CV2 find.contours最小尺寸

问题描述 投票:0回答:1

我正在使用CV2进行手写分割,我使用boundingRect函数来绑定轮廓。问题出现在诸如“=”符号之类的符号上。根据等号的绘制方式,函数将其限制为两个单独的“ - ”符号或单个符号。我尝试在进行预测之前检查boundingRect的最小高度,但是当两个破折号紧密地绘制在一起时会出现问题,即使它们不是,它仍然有时会将两者分开。有没有办法为findContours设置最小高度?或者甚至更好,因为我的输入都是一行,有没有办法防止findContours为单个垂直段找到多个轮廓,这意味着如果两个符号是一个在另一个上面,它将不会采取它们是单独的(如在i,j,=等情况下)这是我当前代码的一部分:

ctrs, hier = cv2.findContours(im_th.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
sorted_ctrs = sorted(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0])

for i, ctr in enumerate(sorted_ctrs):
x, y, w, h = cv2.boundingRect(ctr)
roi = im[y:y+h+20, x:x+w+20]
area = w*h

if 600< area: #Do stuff
python image-processing ocr cv2
1个回答
0
投票

形态学闭合可以用于将两个符号合并在一起,同时保留具有与两者大致相同的外部尺寸的东西。您可以简单地使用与两个等号之间的高度差相匹配的内核大小。这通常用在文本上,例如,用于获得具有多个单独笔划的字符的单个轮廓或者通过某些阈值操作打破,或者同样地,将单个单词的所有字符合并在一起以分别获得每个单词的轮廓。

OpenCV morphological transformations tutorial有一些关于它是如何工作的基本信息。例如,我们将使用它们的起始图像并使用形态学闭合来获得包含小写字母“j”的点和笔划的轮廓:

Binarized letter j

现在使用足够大的内核来关闭,我们得到:

kernel = np.ones((7, 7), np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

Morphologically closed j

当然,这与我们开始时的情况并不完全相同,你会注意到“j”的内角也被填充了一些。这可以在某种程度上避免;您可以在操作之前获得每个角色的轮廓,然后仅选择连接两个单独轮廓的蒙版部分。然而,对于大多数任务而言可能不是必需的,当然也不是你的等号,所以我会忽略它。

现在,您可以像往常一样在此封闭图像上获取轮廓,并从中隐藏原始图像:

_, contours, _ = cv2.findContours(closing, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
bgr_img = cv2.merge([img, img, img])
contour_img = cv2.drawContours(bgr_img, contours, -1, (255, 0, 255))

Single contour over the separated character

您可以使用这些轮廓找到边界框或最小边界矩形。

© www.soinside.com 2019 - 2024. All rights reserved.