使用opencv获取图像中所有文本的位置

2024-04-20 13:10:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个图像,其中包含文字(数字和字母)。我想要得到这幅图像中所有文本和数字的位置。我还想提取所有的文本。

在这里输入图像描述

我如何得到cordinates以及所有的文本(数字和字母)在我的图像。如10B、44、16、38、22B等


Tags: 图像文本字母数字文字cordinates
3条回答

这里有一个潜在的方法,使用形态学操作来过滤非文本轮廓。我们的想法是:

获得二进制图像。负载图像,灰度,然后大津的阈值

移除水平和垂直线条。使用cv2创建水平和垂直内核。然后用cv2. draw等高线删除线条

删除对角线、圆形物体和曲线轮廓。使用轮廓区域cv2过滤。轮廓面积和轮廓近似cv2。使用approxPolyDP来隔离非文本轮廓

提取文本roi和OCR。使用Pytesseract找到ROIs的轮廓和过滤器,然后使用OCR

这是另一种可能的解决方案。我知道你用Python工作——我用c++工作。我会给你们一些想法,如果你们愿意的话,希望你们能够实现这个答案。

其主要思想是根本不使用预处理(至少在初始阶段不使用),而是关注每个目标字符,获取一些属性,并根据这些属性过滤每个blob。

我尽量不使用预处理,因为:1)过滤器和形态阶段可以降低质量的blobs和2)你的目标blobs似乎显示一些特征,我们可以利用,主要是:长宽比和面积。

看看吧,这些数字和字母看起来都比宽的要高……而且,它们在一定的区域内似乎有所不同。例如,您想要丢弃“太宽”或“太大”的对象。

我的想法是过滤掉所有不属于预先计算值的东西。我检查了字符(数字和字母),得到了最小、最大面积值和最小长宽比(这里是高宽比)。

我们来研究一下算法。首先读取图像并将其大小调整到一半。你的形象太大了。转换为灰度和得到一个二进制图像通过大津


 

一种方法是使用滑动窗口(它是昂贵的)。

确定图像中字符的大小(所有字符的大小与图像中看到的相同)并设置窗口的大小。尝试tesseract进行检测(输入图像需要预处理)。如果一个窗口连续检测字符,那么存储该窗口的坐标。合并坐标,得到字符上的区域。

相关问题 更多 >