数学符号OCR识别为LaTeX,方便编辑Markdown文件。
目前公认最后的编辑器是可以很方便的将带有数学公式的图片文章OCR识别为符合 LaTeX 语法标准的数学公式。还可以实现将中文文档识别完整,是图文混合最佳识别器。但是目前只能免费试用。注册用户可以根据使用量来计费,国内注册有点麻烦。本篇主要讲解有哪些可以替代的软件,方便输入数学符号和中文。通过不断尝试和测试,我使用了以下套餐。
·
数学符号编辑器
目前公认最后的编辑器是 mathpix snipping tool
可以很方便的将带有数学公式的图片文章OCR识别为符合 LaTeX 语法标准的数学公式。还可以实现将中文文档识别完整,是图文混合最佳识别器。但是目前只能免费试用。注册用户可以根据使用量来计费,国内注册有点麻烦。
本篇主要讲解有哪些可以替代的软件,方便输入数学符号和中文。
通过不断尝试和测试,我使用了以下套餐。
一、自编程序
以下代码可以解决文本(中文文本)的全部识别。同时处理同个目录下同一后缀名的所有图片文件的OCR识别问题。快捷方便。输出文本文件符合 Markdown 格式需要。
#-*- coding: UTF-8 -*-
"""利用easyocr库,识别指定目录下的所有图像文件中的中文文本。
使用说明:python ocrdir.py 目录名 文件名后缀
使用举例:python ocrdir.py img_dir jpg
输出文件:目录名.md
TODO:1)数学符号或公式识别,暂不支持。 2)速度有点慢,没有使用多线程
run : python F:\Cloud\proj\ocr_math\ocrdir.py g5wb png
"""
import easyocr
import os
import time
from sys import argv
from PIL import Image
def filelist(pathname, extension=""):
'''读取指定目录下,满足指定后缀的所有图像文件列表。
只获取文件名,不带目录名。如
['p0.jpg', 'p1.jpg', 'p2.jpg', 'p3.jpg', 'p4.jpg']
'''
_fn = [_name for _name in os.listdir(pathname) \
if _name.endswith(extension)]
## extension 指定图像文件格式,如 jpg,png,tiff
return _fn
def print_ocr(result):
'''将识别出来的文本分行打印
1. 需要按照 box 的y轴坐标升序排列;
2. 根据文本框的坐标来判断分行行数时。每行的像素超过多少合适? 30 pixels?
3. 如何判断段落?标题?表格?
'''
def newlines(delta, pixels, flag=True):
nline = int(delta//pixels)
if nline < 2: #一个段落内
return '\n'
elif nline < 3: #分段落,多一个空行
return '\n\n'
elif nline > 10:
return '$\\\\[{0}em]$\n'.format(10) if flag else '\n'*11
else:
return '$\\\\[{0}em]$\n'.format(nline-1) if flag else '\n'*nline
# 此处需要测试范例文件来决定 每行所占像素值是否符合源文件。
px_line = 36
try:
rtxt = result[0][1] # 第一个识别结果,
prestart = result[0][0][0] # 第一个识别结果的坐标起点
except:
return ''
for txt in result[1:]:
curstart = txt[0][0]
deltax = curstart[1] - prestart[1]
if deltax > px_line:
rtxt += newlines(deltax, px_line)
else:
rtxt += ' '
rtxt += txt[1]
prestart = curstart
return rtxt
##### <<<Main Program>>> #####
if __name__ == '__main__':
if len(argv) > 1:
start = time.time()
DIRNAME = argv[1]
reader = easyocr.Reader(['ch_sim','en'], gpu = False)
sep = ' '
enter = '<div STYLE="page-break-after: always;"></div>\n\n'
ext = argv[2] if len(argv) > 2 else "png"
outfile = DIRNAME + ".md"
output = open(outfile, encoding='utf-8', mode='a')
# 获取指定目录下的图像文件列表,不带目录名。filelist(DIRNAME, ext)
files = [nf for nf in os.listdir(DIRNAME) if nf.endswith(ext)]
for f in files:
output.write('## ' + f + '\n\n')
file = DIRNAME + '\\' + f # 将目录名添加上去
print("提示信息,正处理 {0} ......".format(f))
img = Image.open(file)
result = reader.readtext(img, detail=1) #detail=0:简化版,detail=1:详细版
myLst = print_ocr(result) #分行文本创建
output.write(myLst+'\n\n') #将本文件内容写入文件。
output.write(enter) #写入分页符 Markdown 格式中用的HTML 分页符
output.close()
print("运行耗时{:.3f}秒!".format(time.time()-start))
else:
print("""
使用说明:python ocrdir.py 目录名 文件名后缀(缺省是png)
使用举例:python ocrdir.py img_dir jpg
""")
二、中文网页 https://simpletex.cn/ai/latex_ocr
simpletex.cn 提供了一款免费且便捷的公式/文档识别工具。支持快速插入图片格式,只需轻松截取公式图片或上传本地图像,即可快速获得数学公式的 LaTeX 表达式。甚至还可以支持手写输入公式。支持 80+ 语言识别。
识别类型暂时分了三类:
- 自动检测(公式、文档)
- 公式
- 文档
大部分都能快速识别,但是需要对文档进行大量编辑工作。
三、少量补救措施
如果还有不能正确识别的文本,我会辅以微信中的提取文本工具来小量补全。
有了以上三种组合,基本不用自己输入中文和数学公式了。
四、Mathpix平替工具 pix2tex/Latex-OCR
- LatexOCR完全使用教程
- 只要运行 latexocr 即可自动下载配置权重文件 weights.pth, 有 100MB 左右。如果下载太慢,建议换一个时间再运行。
参考资料
更多推荐
所有评论(0)