【问题标题】:How to extract text from the highlighted text from an image如何从图像中突出显示的文本中提取文本
【发布时间】:2020-11-12 04:39:55
【问题描述】:

我有一个代码可以突出显示图像中的用户名,我想从该图像中提取文本,即用户名。下面是代码

import matplotlib.pyplot as plt
import cv2
import easyocr
from pylab import rcParams
from IPython.display import Image
rcParams['figure.figsize'] = 8, 16
reader = easyocr.Reader(['en'])
output = reader.readtext('MP-SAMPLE1.jpg')
cord = output[-106][0]
x_min, y_min = [int(min(idx)) for idx in zip(*cord)]
x_max, y_max = [int(max(idx)) for idx in zip(*cord)]

image = cv2.imread('MP-SAMPLE1.jpg')
cv2.rectangle(image,(x_min,y_min),(x_max,y_max),(0,0,255),2)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

我已经根据我的图像设置了坐标,你可以根据你的调整,我需要提取矩形框下突出显示的文本。 我是这个领域的新手,请忽略我会犯的任何错误。

【问题讨论】:

  • 如果可能的话,您能否分享一下MP-SAMPLE1.jpg 或您正在与我们合作的任何图片?
  • 我在问题中添加了图片,请检查
  • 我查看了您的问题,但无法解决。我得到的最好结果是 GRAMONAN GROVER 这很可能是因为我没有印度 pytesseract 数据。
  • 你能把它提取成文本吗?...如果能,你能分享一下代码吗?

标签: python opencv ocr opencv3.0 python-tesseract


【解决方案1】:

这是我对这个问题的部分解决方案。

既然你是初学者,让我给你一个建议,总是从预处理开始。

预处理将帮助您删除不需要的工件。

例如你可以做thresholding:Thresholding-result

median过滤:Median-filter result

我使用了thresholding,那么你可以使用pytesseract 库。该库包含大量configuration options

对于非英语语言,您可以关注此tutorial

因此,您需要FATHERS HUSBANDS 旁边的文本。所以我们可以做

    1. 将图像转换为文本。

      • text = pytesseract.image_to_string(Image.open(f_name), lang='eng')
        
    1. 从文本中,找到FATHERS HUSBANDS的等价物

      • for line in text.split('\n'):
            if "FATHERS HUSBANDS" in line:
                name = line.split('.')[1].split(',')[0]
                print(name)
        
      • 结果:

        • GRAMONAN GROVER
          

姓氏正确但名字部分正确,应该是BRAJMONAN

我写了这个答案,希望你能指导你的解决方案。祝你好运。

代码:


import os
import cv2
import pytesseract

from PIL import Image

img = cv2.imread("FXSCh.jpg")
gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# threshold
gry = cv2.threshold(gry, 0, 255,
                    cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

f_name = "{}.png".format(os.getpid())
cv2.imwrite(f_name, gry)

text = pytesseract.image_to_string(Image.open(f_name), lang='eng')

for line in text.split('\n'):
    if "FATHERS HUSBANDS" in line:
        name = line.split('.')[1].split(',')[0]
        print(name)

os.remove(f_name)

cv2.imshow("Image", img)
cv2.imshow("Output", gry)
cv2.waitKey(0)

【讨论】:

  • 您好,感谢您帮助我,该解决方案适用于特定用例,但我想从多个文档中提取学生的多个详细信息,现在当我提供此解决方案时另一个学生的类似格式标记表它开始给我 -1 作为输出,当我尝试以与提取父亲姓名相同的方式提取学生姓名时,它给了我 -1 输出
  • 知道是否有可靠的方法来检测在打印文档中以物理方式突出显示并在 PDF 中以数字方式突出显示的文本?
  • @oldboy 我不确定,但我想你可以使用inRange thresholding
  • 太棒了,请检查一下。谢谢
猜你喜欢
  • 1970-01-01
  • 2013-05-25
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 2012-09-02
  • 2016-01-20
相关资源
最近更新 更多