Tesseract的OCR结果极不一致

9

enter image description here

这是原始截图,我将图像裁剪成4部分,并尽可能清除了图像的背景,但tesseract只检测到最后一列,忽略了其余部分。

enter image description here

从tesseract输出的结果如实显示,其中有空白字符。在处理结果时,我会将其删除。
  Femme—Fatale.



  DaRkLoRdEIa
  aChineseN1gg4

  Noob_Diablo_

enter image description here

从Tesseract输出的结果如实显示,其中有空白字符,我会在处理结果时将其删除。
Kicked.

NosNoel
ChikiZD
Death_Eag|e_42

Chai—.

enter image description here

3579 10 1 7 148

2962 3 O 7 101

2214 2 2 7 99

2205 1 3 6 78

enter image description here

8212

7198

6307

5640

4884

15

40

40

6O

80

80

我只是在输出内容。

result = `pytesseract.image_to_string(Image.open("D:/newapproach/B&W"+str(i)+".jpg"),lang="New_Language")`

但我不知道如何继续以获得一致的结果。有没有办法让tesseract识别文本区域并使其扫描呢?因为在训练器(SunnyPage)中,tesseract默认识别扫描失败了一些区域,但是一旦我手动选择了所有内容,就可以正确地检测和转换为文本。

代码


你能分享原始未处理的图像吗?数据是在表格中吗? - Amarpreet Singh
@AmarpreetSinghSaini添加了原始图像、清理和裁剪后的图像及其各自的输出,而我只是将数据暂时存储在文本文件中。一旦输出更加准确可靠,我计划稍后使用数据库进行编写。 - codefreaK
@Divaker,请查看已更新的答案。 - Amarpreet Singh
1
你可以尝试调整页面分割方法。这里有一个列表,其中一个可能比默认设置更适合你的问题:https://github.com/tesseract-ocr/tesseract/wiki/ImproveQuality - Saedeas
我查看了该页面,你有Python实现的文档或者在哪里指定分割属性的任何想法吗? - codefreaK
我不知道你是否在使用PyTesser,但是原始问题中有一个示例,在其中OP指定了页面分割方法(PSM选项):https://stackoverflow.com/questions/16303398/tesseractnotfound-pytesser 希望这可以帮助你! - Saedeas
5个回答

11

尝试使用命令行,它可以让我们决定使用哪个psm值。

你可以试试这个:

pytesseract.image_to_string(image, config='--psm 6')

使用您提供的图像进行了测试,以下是结果:

图像中提取的文本

我遇到的唯一问题是,我的tesseract字典将您提供的图像中的“1”解释为“I”。

下面是可用的psm选项列表:

pagesegmode值为: 0 = 仅方向和脚本检测(OSD)。 1 = 使用OSD的自动页面分割。 2 = 自动页面分割,但没有OSD或OCR 3 = 完全自动的页面分割,但没有OSD。(默认) 4 = 假设单个不同大小的文本列。 5 = 假设单个统一对齐的文本块。 6 = 假设单个统一的文本块。 7 = 将图像视为单个文本行。 8 = 将图像视为单个单词。 9 = 将图像视为圆形中的单个单词。 10 = 将图像视为单个字符。


让我检查一下,然后回复你。 - codefreaK
我所寻找的是如何传递这个psm参数。我觉得很有趣,因为我并没有只是谷歌image_to_string参数。尝试了所有的方法,但没有那个。https://github.com/tesseract-ocr/tesseract/wiki/ImproveQuality 我之前查看过这个,但从未看到文档。 - codefreaK
这里有一个类似的答案:https://dev59.com/FlcP5IYBdhLWcg3wTIMt,但有一个小(大)区别,在`psm`之前只有一个破折号而不是两个。我尝试了`--psm`,什么也没有得到,然后使用了`-psm`,配置选项产生了巨大的差异。我正在使用Python 2.7和Tesseract 3.04.01。 - elPastor

1
我使用了这个链接。

https://www.howtoforge.com/tutorial/tesseract-ocr-installation-and-usage-on-ubuntu-16-04/

只需使用以下命令即可将准确性提高50%。

sudo apt update

sudo apt install tesseract-ocr

sudo apt-get install tesseract-ocr-eng

sudo apt-get install tesseract-ocr-all

sudo apt install imagemagick

convert -h

tesseract [image_path] [file_name]

convert -resize 150% [input_file_path] [output_file_path]

convert [input_file_path] -type Grayscale [output_file_path]

tesseract [image_path] [file_name]

它只会显示粗体字

谢谢


0

我的建议是对整个图像进行OCR处理。

我已经预处理了图像,得到了灰度图像。

import cv2
image_obj = cv2.imread('1D4bB.jpg')
gray = cv2.cvtColor(image_obj, cv2.COLOR_BGR2GRAY)
cv2.imwrite("gray.png", gray)

我已经在终端上对图像运行了Tesseract,而且在这种情况下准确度似乎也超过了90%。

tesseract gray.png out

3579 10 1 7 148
3142 9 o 5 10
2962 3 o 7 101
2214 2 2 7 99
2205 1 3 6 78
Score Kills Assists Deaths Connection
8212 15 1 4 4o
7198 7 3 6 40
6307 6 1 5 60
5640 2 3 6 80
4884 1 1 5 so

以下是一些建议 -

  1. 不要直接使用image_to_string方法,因为它会将图像转换为bmp格式并以72 dpi保存。
  2. 如果您想使用image_to_string,则可以覆盖它以将图像保存在300 dpi中。
  3. 您可以使用run_tesseract方法,然后读取输出文件。

我运行OCR的图像。 enter image description here

解决这个问题的另一种方法是裁剪数字并深入神经网络进行预测。


你能否添加一下你运行Tesseract扫描的图片?关于1、2、3,我已经将图像转换为灰度,并保存为300+ dpi,然后进行了扫描。所以你是在告诉我,如果我将一个300 dpi的图像传递给image_to_string,它会被转换为72 dpi吗? - codefreaK
不,image_to_string函数没有接受自定义dpi参数的选项。您需要覆盖它。 - Amarpreet Singh
我可能会从以下灰度中得到一条文本。我从那里开始,然后深入尝试了许多东西。所以为了让这对我起作用,我必须清除背景并将图像分成4个裁剪的团队名称图片和其余的得分值。我现在拥有的不是问题,你刚才说的。我正在尝试找到另一个解决方案,这就是为什么纯粹的空白图像无法识别的原因。看到我使用sunnypage来识别和训练新语言。在使用它时,即使图像为300dpi或1000dpi,如果您尝试识别,只能找到2列。 - codefreaK
但是,如果我手动选择要识别的区域,则可以得到完美的输出。问题在于,尽管图像具有300 dpi和清晰的背景,并且只剩下文本,但tesseract实际上会跳过随机区域进行处理。我开始使用与您相同的方法从灰度中提取数据,但它的准确性非常低,无法保持一致。您需要像我一样做,关于球员姓名,大多数情况下我可以获得99.9%的准确性,但是我在团队得分方面遇到了问题,因为很多时候它会随机跳过检测列。 - codefreaK
不管谁给这个答案负面评价,请说明原因。 - Amarpreet Singh

-1

我认为您首先需要对图像进行预处理,对我有效的更改如下:

假设

import PIL
img= PIL.Image.open("yourimg.png")
  • 将图像放大,我通常会将图像大小加倍。

    img.resize(img.size[0]*2, img.size[1]*2)

  • 将图像转换为灰度

    img.convert('LA')

  • 使字符更加粗体,你可以在这里看到一种方法:https://blog.c22.cc/2010/10/12/python-ocr-or-how-to-break-captchas/,但是这种方法相当慢,如果你使用它,我建议使用另一种方法

  • 使用gimpfu选择、反选、填充黑色、白色

    image = pdb.gimp_file_load(file, file) layer = pdb.gimp_image_get_active_layer(image) REPLACE= 2 pdb.gimp_by_color_select(layer,"#000000",20,REPLACE,0,0,0,0) pdb.gimp_context_set_foreground((0,0,0)) pdb.gimp_edit_fill(layer,0) pdb.gimp_context_set_foreground((255,255,255)) pdb.gimp_edit_fill(layer,0)

    pdb.gimp_selection_invert(image) pdb.gimp_context_set_foreground((0,0,0))


请检查我编写的代码,我在尝试清理图像之前将图像放大了3倍。 请在回复之前检查代码。请参阅屏幕截图和示例图像。我已清除所有内容并将其变为黑白色。我已经按照您提供的答案做了一切,现在我面临的问题是,当将此https://i.stack.imgur.com/tytSQ.jpg样的清晰背景图像作为输入提供给tesseract时,它无法检测到除2列以外的任何内容,而在这种情况下,即使是这张图片https://i.stack.imgur.com/tytSQ.jpg也可以正确识别。我的问题很具体,是关于这种奇怪行为的原因。 - codefreaK
如果有人能够给我解释一下,并提供可能的修复方法。 - codefreaK

-1
fn = 'image.png'
img = cv2.imread(fn, 0)
img = cv2.bilateralFilter(img, 20, 25, 25)
ret, th = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# Image.fromarray(th)
print(pytesseract.image_to_string(th, lang='eng'))

1
请始终将您的答案放在上下文中,而不仅仅是粘贴代码。有关更多详细信息,请参见此处 - gehbiszumeis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接