【发布时间】:2017-04-17 11:12:58
【问题描述】:
背景
我想检测包含 2D 几何形状的图像中的所有轮廓,但去掉任何看起来像文本的东西。
我尝试通过 Tesseract 检测文本区域并随后删除这些文本区域。对于 OCR 识别良好的某些图像,这可以正常工作,因此文本区域的识别率非常高,然后可以删除已识别文本的轮廓。但是对于大多数图像,文本无法很好地识别,因此我无法从图像中删除不相关的文本轮廓。
因此我的问题是:如何区分类似文本的轮廓和我的 2D“几何”轮廓?
【问题讨论】:
背景
我想检测包含 2D 几何形状的图像中的所有轮廓,但去掉任何看起来像文本的东西。
我尝试通过 Tesseract 检测文本区域并随后删除这些文本区域。对于 OCR 识别良好的某些图像,这可以正常工作,因此文本区域的识别率非常高,然后可以删除已识别文本的轮廓。但是对于大多数图像,文本无法很好地识别,因此我无法从图像中删除不相关的文本轮廓。
因此我的问题是:如何区分类似文本的轮廓和我的 2D“几何”轮廓?
【问题讨论】:
如果您不关心文本并且只想摆脱它,那么您可以通过将RETR_EXTERNAL 作为模式参数传递给findCountours() 函数来检测外部轮廓。这将为您提供最外层的轮廓,并忽略几何形状内部包含的任何内容。
或者,如果您想要更多控制,您可以将模式参数作为 RETR_TREE 传递,然后遍历树,只保留顶层轮廓并忽略层次结构中低于该级别的任何内容。这样,您将获得所有内容,并且您可以稍后决定要保留哪些内容以及要忽略哪些内容。
阅读 OpenCV 文档中的 this page,了解有关 findCountours() 如何表示层次结构的信息(该页面来自 python 教程,但它足够通用,可以继续学习)。
当然,只有当图像总是看起来与您在问题中给出的示例相似时才会起作用 - 即文本总是在几何形状内。如果您在形状之外有文本,那么也许您可以查看轮廓(边界矩形)的大小并忽略低于某个阈值的任何内容(假设文本轮廓将比您的几何形状小得多)。
【讨论】:
findCountours() 找不到它,那么它只会给你几何形状?只是另一个想法......
属于文本的轮廓,根据您的示例也代表一个区域。这样您就可以尝试使用区域的属性来消除一些不需要的区域(文本轮廓!),我建议您可以使用一些属性,例如 eccentricity、solidity 或 compactness(你可以在这里找到代码示例:https://github.com/mribrahim/Blob-Detection )
例如:规则形状和其他形状可以通过 compactness 值来区分,或者您可以组合任何其他属性
【讨论】: