tesseract 的 OCR 结果高度不一致
Highly inconsistent OCR result for tesseract
这是原始屏幕截图,我将图像裁剪为 4 部分,并尽可能清除图像的背景,但 tesseract 仅检测此处的最后一列并忽略其余部分。
tesseract 的输出显示为存在我在处理结果时删除的空格
Femme—Fatale.
DaRkLoRdEIa
aChineseN1gg4
Noob_Diablo_
tesseract 的输出显示为存在我在处理结果时删除的空格
Kicked.
NosNoel
ChikiZD
Death_Eag|e_42
Chai—.
3579 10 1 7 148
2962 3 O 7 101
2214 2 2 7 99
2205 1 3 6 78
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")`
但我不知道如何从这里开始获得一致的 result.Is 无论如何,这样我就可以强制 tesseract 识别文本区域并使其在训练器中扫描 that.Because ( SunnyPage),tesseract 在默认识别扫描时无法识别某些区域,但是一旦我 select 手动检测到所有内容并正确翻译成文本
Code
我的建议是对整张图片进行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
以下是一些建议 -
- 不要直接使用 image_to_string 方法,因为它会将图像转换为 bmp 并以 72 dpi 保存。
- 如果您想使用 image_to_string 然后覆盖它以 300 dpi 保存图像。
- 您可以使用run_tesseract方法,然后读取输出文件。
我 运行 OCR 的图像。
Another approach for this problem can be to crop the digits and deep to a neural network for prediction.
我认为您必须先对图像进行预处理,对我有用的更改是:
假设
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/
但是这种方法相当慢,如果你使用它,我建议使用另一种方法
Select,反选,黑色填充,白色使用gimpfu
图片=pdb.gimp_file_load(文件,文件)
图层 = pdb.gimp_image_get_active_layer(图像)
替换= 2
pdb.gimp_by_color_select(图层,"#000000",20,REPLACE,0,0,0,0)
pdb.gimp_context_set_foreground((0,0,0))
pdb.gimp_edit_fill(图层,0)
pdb.gimp_context_set_foreground((255,255,255))
pdb.gimp_edit_fill(图层,0)
pdb.gimp_selection_invert(图片)
pdb.gimp_context_set_foreground((0,0,0))
尝试使用命令行,我们可以选择使用哪个 psm 值。
你能试试这个吗:
pytesseract.image_to_string(image, config='--psm 6')
用你提供的图片试过,结果如下:
Extracted Text Out of Image
我面临的唯一问题是我的 tesseract 字典正在将您图像中提供的“1”解释为“我”。
下面是可用的 psm 选项列表:
pagesegmode 值为:
0 = 仅方向和脚本检测 (OSD)。
1 = 使用 OSD 自动分页。
2 = 自动页面分割,但没有 OSD 或 OCR
3 = 全自动页面分割,但没有 OSD。 (默认)
4 = 假定单列文本大小可变。
5 = 假设单个统一的垂直对齐文本块。
6 = 假设一个统一的文本块。
7 = 将图像视为单个文本行。
8 = 将图像视为一个单词。
9 = 将图像视为圆圈中的单个单词。
10 = 将图像视为单个字符。
我用过这个link
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]
只会显示粗体字
谢谢
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'))
这是原始屏幕截图,我将图像裁剪为 4 部分,并尽可能清除图像的背景,但 tesseract 仅检测此处的最后一列并忽略其余部分。
tesseract 的输出显示为存在我在处理结果时删除的空格
Femme—Fatale.
DaRkLoRdEIa
aChineseN1gg4
Noob_Diablo_
tesseract 的输出显示为存在我在处理结果时删除的空格
Kicked.
NosNoel
ChikiZD
Death_Eag|e_42
Chai—.
3579 10 1 7 148
2962 3 O 7 101
2214 2 2 7 99
2205 1 3 6 78
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")`
但我不知道如何从这里开始获得一致的 result.Is 无论如何,这样我就可以强制 tesseract 识别文本区域并使其在训练器中扫描 that.Because ( SunnyPage),tesseract 在默认识别扫描时无法识别某些区域,但是一旦我 select 手动检测到所有内容并正确翻译成文本
Code
我的建议是对整张图片进行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
以下是一些建议 -
- 不要直接使用 image_to_string 方法,因为它会将图像转换为 bmp 并以 72 dpi 保存。
- 如果您想使用 image_to_string 然后覆盖它以 300 dpi 保存图像。
- 您可以使用run_tesseract方法,然后读取输出文件。
我 运行 OCR 的图像。
Another approach for this problem can be to crop the digits and deep to a neural network for prediction.
我认为您必须先对图像进行预处理,对我有用的更改是: 假设
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/ 但是这种方法相当慢,如果你使用它,我建议使用另一种方法
Select,反选,黑色填充,白色使用gimpfu
图片=pdb.gimp_file_load(文件,文件) 图层 = pdb.gimp_image_get_active_layer(图像) 替换= 2 pdb.gimp_by_color_select(图层,"#000000",20,REPLACE,0,0,0,0) pdb.gimp_context_set_foreground((0,0,0)) pdb.gimp_edit_fill(图层,0) pdb.gimp_context_set_foreground((255,255,255)) pdb.gimp_edit_fill(图层,0)
pdb.gimp_selection_invert(图片) pdb.gimp_context_set_foreground((0,0,0))
尝试使用命令行,我们可以选择使用哪个 psm 值。
你能试试这个吗:
pytesseract.image_to_string(image, config='--psm 6')
用你提供的图片试过,结果如下:
Extracted Text Out of Image
我面临的唯一问题是我的 tesseract 字典正在将您图像中提供的“1”解释为“我”。
下面是可用的 psm 选项列表:
pagesegmode 值为: 0 = 仅方向和脚本检测 (OSD)。
1 = 使用 OSD 自动分页。
2 = 自动页面分割,但没有 OSD 或 OCR
3 = 全自动页面分割,但没有 OSD。 (默认)
4 = 假定单列文本大小可变。
5 = 假设单个统一的垂直对齐文本块。
6 = 假设一个统一的文本块。
7 = 将图像视为单个文本行。
8 = 将图像视为一个单词。
9 = 将图像视为圆圈中的单个单词。
10 = 将图像视为单个字符。
我用过这个link
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]
只会显示粗体字
谢谢
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'))