C++ OpenCV:忽略类似文本的轮廓

C++ OpenCV:忽略类似文本的轮廓,c++,opencv,opencv3.0,C++,Opencv,Opencv3.0,背景 我想检测包含2D几何形状的图像中的所有轮廓,但去掉任何看起来像文本的东西 输入示例: 我试图通过Tesseract检测文本区域,然后删除这些文本区域。对于一些OCR识别良好的图像,这种方法效果很好,因此可以以相当好的速度识别文本区域,然后可以删除已识别文本的轮廓。但是对于大多数图像,文本没有被很好地识别,因此我无法从图像中删除不相关的文本轮廓 因此,我的问题是:如何区分文本状轮廓和二维“几何”轮廓 如果您不关心文本,只想删除它,那么您可以通过将RETR\u EXTERNAL作为模式参数传

背景

我想检测包含2D几何形状的图像中的所有轮廓,但去掉任何看起来像文本的东西

输入示例:

我试图通过Tesseract检测文本区域,然后删除这些文本区域。对于一些OCR识别良好的图像,这种方法效果很好,因此可以以相当好的速度识别文本区域,然后可以删除已识别文本的轮廓。但是对于大多数图像,文本没有被很好地识别,因此我无法从图像中删除不相关的文本轮廓


因此,我的问题是:如何区分文本状轮廓和二维“几何”轮廓

如果您不关心文本,只想删除它,那么您可以通过将
RETR\u EXTERNAL
作为模式参数传递给
findcontours()
函数来检测外部轮廓。这将为您提供最外层的轮廓,并忽略几何图形中包含的任何内容

或者,如果需要更多控制,可以将mode参数作为RETR_TREE传递,然后遍历树,只保留顶层轮廓,忽略层次结构中低于该级别的任何内容。这样你会得到一切,你可以决定以后你想要保留什么和你想要忽略什么

阅读OpenCV文档,了解有关
findcontours()
如何表示层次结构的信息(该页面来自python教程,但它的通用性足以让人理解)


当然,只有当图像看起来总是与您在问题中给出的示例相似时,这才有效-即文本总是在几何形状内部。如果形状之外有文本,则可能可以查看轮廓(边界矩形)的大小,忽略低于某个阈值的任何内容(假设文本轮廓将比几何图形小得多)。

根据示例,属于文本的轮廓也代表一个区域。因此,您可以尝试使用区域属性来消除一些不需要的区域(文本轮廓!),我建议您可以使用一些属性,如偏心率坚固性紧凑性(您可以在这里找到代码示例: )


例如:规则形状和其他形状可以通过使用紧致性值来区分,或者您可以组合任何其他属性

我意识到我应该给出一个更好的示例。不幸的是,这不起作用,因为我不知道嵌套级别。例如,我有一个相邻的矩形,它创建了一个外部矩形(我也需要优化),文本可以出现在任何嵌套深度。编辑:我也考虑过比较区域大小,但我希望有更复杂的东西,因为etxt也可以是任何大小。那么,可能是这两种方法的组合?使用RETR_树,然后在边界矩形区域的差异大于x%的较大轮廓内查找一组(两个或更多)小轮廓?我不知道,只是抛出一些想法。我只是觉得尝试用OCR识别文本是过分的,因为你不在乎文本的内容,只想过滤掉那些不属于形状的东西。文本总是某种颜色,还是一组有限的颜色?也许寻找被另一种颜色包围的黑色或白色像素组?或者可能首先对图像应用高斯模糊?如果足够模糊,文本可能变得足够模糊,以至于
findcontours()
找不到它,那么它只会给出几何图形?只是另一个想法…谢谢你的意见。我将进行更多的实验,并尝试模糊。