【问题标题】:OpenCV: Ignore text-like contoursOpenCV:忽略类似文本的轮廓
【发布时间】:2017-04-17 11:12:58
【问题描述】:

背景

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

示例输入:

我尝试通过 Tesseract 检测文本区域并随后删除这些文本区域。对于 OCR 识别良好的某些图像,这可以正常工作,因此文本区域的识别率非常高,然后可以删除已识别文本的轮廓。但是对于大多数图像,文本无法很好地识别,因此我无法从图像中删除不相关的文本轮廓。

因此我的问题是:如何区分类似文本的轮廓和我的 2D“几何”轮廓?

【问题讨论】:

    标签: c++ opencv opencv3.0


    【解决方案1】:

    如果您不关心文本并且只想摆脱它,那么您可以通过将RETR_EXTERNAL 作为模式参数传递给findCountours() 函数来检测外部轮廓。这将为您提供最外层的轮廓,并忽略几何形状内部包含的任何内容。

    或者,如果您想要更多控制,您可以将模式参数作为 RETR_TREE 传递,然后遍历树,只保留顶层轮廓并忽略层次结构中低于该级别的任何内容。这样,您将获得所有内容,并且您可以稍后决定要保留哪些内容以及要忽略哪些内容。

    阅读 OpenCV 文档中的 this page,了解有关 findCountours() 如何表示层次结构的信息(该页面来自 python 教程,但它足够通用,可以继续学习)。

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

    【讨论】:

    • 我意识到我应该举一个更好的例子。不幸的是,这不起作用,因为我不知道嵌套级别。例如,我有相邻的矩形,它们创建了一个外部矩形(我也需要对其进行优化),并且文本可以出现在任何嵌套深度中。编辑:我还考虑过比较区域大小 - 但我希望有更复杂的东西,因为 etxt 也可以是任何大小。
    • 也许是这两种方法的结合,那么呢?使用 RETR_TREE,然后在一个较大的轮廓内寻找一组(两个或更多)小轮廓,其中边界矩形的面积差异大于 x%?我不知道,只是抛出想法。我只是认为尝试使用 OCR 识别文本是多余的,因为您不关心文本的内容,只想过滤掉不属于形状的内容。文本将始终是某种颜色,还是一组有限的颜色?也许寻找被另一种颜色包围的黑色或白色像素组?
    • 或者先对图像应用高斯模糊?如果你模糊它,文本可能会模糊到findCountours() 找不到它,那么它只会给你几何形状?只是另一个想法......
    • 感谢您的意见。我会多做一些实验,并尝试模糊。
    【解决方案2】:

    属于文本的轮廓,根据您的示例也代表一个区域。这样您就可以尝试使用区域的属性来消除一些不需要的区域(文本轮廓!),我建议您可以使用一些属性,例如 eccentricitysolidity 或 compactness(你可以在这里找到代码示例:https://github.com/mribrahim/Blob-Detection )

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 2021-04-13
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多