【问题标题】:how do I accurately extract one line of data from this image using python如何使用python准确地从该图像中提取一行数据
【发布时间】:2021-02-28 21:58:40
【问题描述】:

我正在尝试仅删除其中的一行。所以我希望当我运行 pytesseract 时,我会得到可用的数据。

相反,我得到了像'Ce eet il ae oe a on) os\n\nooo eo oo oo oom om om om)\n\n[OO COCO ORR OW OR PRP ODWWG\n\neyo fe) Fee ote) = = - = = eo me-e-)\n\n(Ss: oo ~7~oO 0 0\n\neB\n\n© te O fa ©\n\nOORFONONWR OW DFW NN\n\nVaso\nVES -5)\n1866\nnny\n1625\n1368\nLt\n1070\n898\n838\nwhey)\nom\na\nRie)\n15\n\nny,\n\n=ARAM= gksvlrwOlf\nDarth_Zipzap\naE a\njohnny478423\n=CNAPG _920831993\nOLOLUCTIIN AG\nRivDecartes\nfleadog406\nFormula13\n\nxL LongDubber\nDankdudledan\n_Trix_1740\n\nLUT engl)\n\n=MOPB= JP_Akatonbo\nPlutoh71689\nMakinHerSquirt\n\x0c'这样的字符串

我尝试将其灰度化,但无济于事。我认为考虑到这里的离散列,我可以将字符串拆分为空格和换行符,但是......不。

任何正确方向的指针将不胜感激。

在之前的实验中,我遇到了一些麻烦,因为像小控制器图标这样的图像,我只能在将图像传递给 tesseract 之前检测并屏蔽这些图像。但在这张图片中,tesseract 未能非常一致地识别列中的数字。

【问题讨论】:

  • 您是否尝试将图像部分裁剪为仅一行然后使用 tesseract?尝试获取行之间的 y 间隔,然后分别遍历每一行
  • 一行会改变。如果我能确定哪一行有我正在寻找的用户名,我可能会这样做,但我也不知道该怎么做。我想我可以尝试寻找较小的文本框边界,例如 geeksforgeeks.org/… 演示,看看我是否可以找到包含名称的文本框的坐标,以便拉出那一行。
  • 您可以使用与此处相同的解决方案:stackoverflow.com/questions/52083129/…

标签: python opencv tesseract


【解决方案1】:
  • 我尝试将其灰度化无济于事。

将图像转换为灰度将使计算更快,因为您正在从 3 通道减少到 1 通道。如果你的意思是“我已经应用了预处理,但没有用”,那么你应该看看下面的techniques。转换为灰度不是预处理,而是计算优势。

  • 我认为考虑到这里的离散列,我可以将字符串拆分为空格和换行符,但是......不。

您尝试过不同的page-segmentation-modes 吗?有时识别输入文本的默认值不准确。因此,您应该尝试其他模式。

  • 任何正确方向的指针都将不胜感激。

输入图像的第一个事实是您不需要后半部分。如果您当前的图像大小是HW,那么您需要H/2W

第二个事实是我们需要binarize 图像。结果将是:

如果你读取结果图像,假设一个统一的文本块:

1 0 3 0 0 7 Whey. =ARAM= qksvlrwolf
3 0 3 0 0 7 2389 Darth_Zipzap
4° 0 6 0 0 3 1866 KILLAIRE
4 1 1 0 8 1 ARs johnny478423
3 0 1 0 0 6 1625 =CNAPC= _920831993
3 0 1 0 0 3 1368 ole] NCAT LG
2 0 0 0 13 0 1291 RN Bstecl ates)
4° 0 3 0 0 1 1070 fleadog406
1 0 0 0 0 3 eds imelaial etch}
2 01 0 1 2 CRS xL LongDubber
1 0 1 0 11 0 rh Dankdudledan
0 0 0 0 0 2 611 _Trix_1740
2 1 0 0 0 #0 Zs Illinois_Fats
10000 1 309 =MOPB= JP_Akatonbo
2 0 0 0 0 90 15 Plutoh71689
1 00 0 0 0 vy MakinHerSquirt

与之前的尝试相比,您将获得更准确的结果。然而,并不是每个单词都能被准确识别。您可以执行以下操作:

    1. 可以逐行获取,逐行识别。
    1. 您可以将border 添加到您的图像中。将图像居中可能会提高准确性。

代码:

# Load the libraries
import cv2
import pytesseract

# Load the image in BGR format
img = cv2.imread("NwEsC.png")

# Get first-half of the image
(h, w) = img.shape[:2]
img = img[0:int(h/2), 0:w]

# Convert to the gray-scale
gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

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

# OCR
txt = pytesseract.image_to_string(thr, config="--psm 6")
print(txt)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多