数学符号编辑器

目前公认最后的编辑器是 mathpix snipping tool

可以很方便的将带有数学公式的图片文章OCR识别为符合 LaTeX 语法标准的数学公式。还可以实现将中文文档识别完整,是图文混合最佳识别器。但是目前只能免费试用。注册用户可以根据使用量来计费,国内注册有点麻烦。

本篇主要讲解有哪些可以替代的软件,方便输入数学符号和中文。

通过不断尝试和测试,我使用了以下套餐。

一、自编程序

ocrdir.py

以下代码可以解决文本(中文文本)的全部识别。同时处理同个目录下同一后缀名的所有图片文件的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 左右。如果下载太慢,建议换一个时间再运行。

参考资料

1、数学公式识别(Mathpix + pix2tex)

2、LatexOCR完全使用教程

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐