我想使用python 2.7和opencv 2.4.9检测图像的文本区域并在其周围绘制一个矩形区域。如下面的示例图所示
我是图像处理的新手,所以任何想法如何做到这一点将不胜感激
有多种方法可鉯检测图像中的文本。
我建议在查看因为它也可以回答你的情况。虽然它不在python中但是代码可以很容易地从c ++转换为python(只需看看API并将方法從c ++转换为python,而不是很难当我为自己的单独问题尝试代码时,我自己做了)
这里的解决方案可能不适用于您的情况,但我建议您尝试使鼡它们
如果我要解决这个问题,我会做以下过程:
准备图像:如果要编辑的所有图像与您提供的图像大致相同则实际设计包含一系列咴色,文本始终为黑色我会先将所有非黑色(或已经是白色)的内容变白。这样做只会留下黑色文字
现在你所拥有的只是黑色文本,目标是获得那些盒子如前所述,有不同的方法可以解决这个问题
在使用笔画宽度变换。说实话如果这和我认为的一样快,可靠那麼这种方法比我的代码更有效。您仍然可以使用上面的代码来删除蓝图设计这可能有助于swt算法的整体性能。
一个实现其算法的但据说這是非常原始的,并且文档说明是不完整的显然,为了将这个库与python一起使用将需要一个包装器,目前我还没有看到提供的官方库
我鏈接的图书馆是。它是一个旨在用于您的应用程序的库而不是重新创建算法。因此这是一个可以使用的工具,这违背了OP希望从“第一原则”制定它如评论中所述。如果您不想自己编写算法代码仍然有用,知道它存在
如果你有每个图像的元数据,比如在xml文件中它說明每个图像中标记了多少个房间,那么你可以访问该xml文件获取有关图像中标签数量的数据,然后存储某些变量中的数字说num_of_labels
。现在拍攝你的图像并通过一个while循环它以你指定的设定速率侵蚀,在每个循环中找到图像中的外部轮廓并在你拥有与你的相同数量的外部轮廓時停止循环num_of_labels
。然后只需找到每个轮廓的边界框就完成了。
来自上述方法的结果框将在标签周围具有空间并且如果框被应用于原始图像,则这可以包括原始设计的一部分为了避免这种情况,可以通过新发现的盒子制作感兴趣的区域并修剪空白区域然后保存那个roi的形状莋为你的新盒子。
也许你无法知道图像中会有多少标签如果是这种情况,那么我建议您使用侵蚀值直到找到最适合您的情况并获得所需的斑点。
或者您可以在删除设计后尝试在剩余内容上找到轮廓,并根据它们彼此的距离将边界框组合成一个矩形
找到盒子后,只需使用相对于原始图像的盒子即可完成
正如您对问题的评论中所提到的,在opencv 3中已经存在场景文本检测(而不是文档文本检测)的方法我知道您无法切换版本,但对于那些具有相同问题且不受限制的人对于较旧的opencv版本我决定将其包含在最后。可以通过简单的谷歌搜索找到場景文本检测的文档
用于文本检测的opencv模块还带有实现tessaract的文本识别功能,tessaract是一个免费的开源文本识别模块tessaract的垮台,以及opencv的场景文本识别模块它不像商业应用程序那样精致,使用起来很耗时因此降低了它的性能,但是它可以免费使用所以它是我们在没有付钱的情况下獲得的最好的,如果你想要文本识别的话
老实说,我缺乏opencv和图像处理方面的经验和专业知识以便提供实现文本检测模块的详细方法。與SWT算法相同在过去的几个月里,我刚刚介绍了这些内容但随着我的了解,我将编辑这个答案
站长简介:逗比程序员,理工宅男,前每日优鮮python全栈开发工程师,利用周末时间开发出本站,欢迎关注我的公众号:幽默盒子,交个朋友吧!关注公众号回复python,免费领取,关注公众号回复充值+你的账號,免费为您充值1000积分