首页 > 编程语言 >Python环境下LaTeX数学公式转图像方案调研与探讨

Python环境下LaTeX数学公式转图像方案调研与探讨

时间:2023-10-28 22:24:21浏览次数:34  
标签:__ LaTeX img 渲染 Python 公式 cv2 数学公式

@

目录

引言

近来,涉及到一些公式识别的项目,输入是公式的图像,输出是LaTeX格式的数学公式字符串。

这类项目一般都采用深度学习的方法来做,这就涉及到构造公式LaTeX字符串对应渲染后图像的数据集。来训练模型。

经过调研,这种数据来源一般有两种,一是人工标注;二是合成。鉴于训练模型所需庞大的数据量,优先考虑合成这种数据。而合成这种数据集时,就需要将公式的LaTeX字符串渲染为公式的图像,如下图所示:
在这里插入图片描述
为此,我做了一些调研,寻求可以实现以上这种效果的方案。

方案一:基于LaTeX环境

该方案需要安装LaTeX环境,MacOS下的安装包大概有5.2G左右。

优点是支持所有的LaTeX文档的渲染,缺点是环境太占地了。

如果使用场景涉及到公式的复杂和多样性,则有必要安装这个环境,然后采用python调用渲染。

具体操作文档,大家可以去网上搜索一番,我这里就不再赘述。

方案二:基于KaTeX

KaTeX 是一个快速,易于使用的JavaScript库,用于在Web上进行TeX数学渲染。支持大部分LaTeX语法。

基于KaTeX方案合成训练所用数据集的方案,只是我的构想,可以单独启动一个支持公式渲染的KaTeX的服务,然后python调用这个服务,输入公式LaTeX字符串,返回渲染后的数学公式图像。

值得说明的是,我并没有真正尝试这种方案,但是是具有可行性的,同时我在Github上并没有找到这种方案的项目。

(推荐) 方案三:基于Matplotlib

基于Matlplotib的方案,我是比较倾向这种方案的,不用额外安装LaTeX环境,因为Matplotlib 实现了一个轻量级的 TeX 表达式解析器和布局引擎,Mathtext 是该引擎支持的 Tex 标记的子集。这一部分的详细介绍,可参见官方文档:Writing mathematical expressions

使用例子:

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(3, 3), linewidth=1, edgecolor='black')
fig.text(.2, .7, "plain text: alpha > beta")
fig.text(.2, .5, "Mathtext: $\\alpha > \\beta$")
fig.text(.2, .3, r"raw string Mathtext: $\alpha > \beta$")

渲染结果如下:
在这里插入图片描述
不需要安装 TeX 即可使用 Mathtext,因为 Matplotlib 附带了 Mathtext 解析器和引擎。 Mathtext 布局引擎是对 Donald Knuth 的 TeX 中布局算法的相当直接的改编。

设想:可以基于matplotlib这个功能,编写一个自动合成开篇所讲的数据集的小工具。输入公式的LaTeX字符串,输出渲染后的数学公式图像。为此,我写了一个demo代码,大概思路是:

flowchart LR A(公式LaTeX字符串) --> B(Matplotilb渲染得到图像) --> C(裁剪多余部分) --> D(只有公式的图像)

整体流程图如下:
在这里插入图片描述
相关代码如下:
借助matplotlib渲染公式部分:

from matplotlib import pyplot as plt

fig = plt.figure(linewidth=1, facecolor="white", layout="tight")
fig.text(0.2, 0.5, r"$c = a^2 + b^2$")
fig.savefig("equation.png")

裁剪多余图像多余部分的代码:

import cv2
import numpy as np


class CropByProject:
    """投影法裁剪"""

    def __init__(self, threshold: int = 250):
        self.threshold = threshold

    def __call__(self, origin_img):
        image = cv2.cvtColor(origin_img, cv2.COLOR_BGR2GRAY)

        # 反色,将大于threshold的值置为0,小于的改为255
        retval, img = cv2.threshold(image, self.threshold, 255, cv2.THRESH_BINARY_INV)

        # 使文字增长成块
        closed = cv2.dilate(img, None, iterations=1)

        # 水平投影
        x0, x1 = self.get_project_loc(closed, direction="width")

        # 竖直投影
        y0, y1 = self.get_project_loc(closed, direction="height")

        return origin_img[y0:y1, x0:x1]

    @staticmethod
    def get_project_loc(img, direction):
        """获得裁剪的起始和终点索引位置
        Args:
            img (ndarray): 二值化后得到的图像
            direction (str): 'width/height'
        Raises:
            ValueError: 不支持的求和方向
        Returns:
            tuple: 起始索引位置
        """
        if direction == "width":
            axis = 0
        elif direction == "height":
            axis = 1
        else:
            raise ValueError(f"direction {direction} is not supported!")

        loc_sum = np.sum(img == 255, axis=axis)
        loc_range = np.argwhere(loc_sum > 0)
        i0, i1 = loc_range[0][0], loc_range[-1][0]
        return i0, i1


if __name__ == "__main__":
    cropper = CropByProject()

    img_path = "equation.png"

    img = cv2.imread(img_path)

    result = cropper(img)

    cv2.imwrite("res.png", result)

写在最后

目前,公开的公式识别数据集,已经有很多了,包括一些公式识别的比赛以及开源项目中都有涉及,我这里就不再一一列举了,大家可自行寻找。

标签:__,LaTeX,img,渲染,Python,公式,cv2,数学公式
From: https://www.cnblogs.com/shiwanghualuo/p/17794765.html

相关文章

  • Python第二章读书笔记-2023.10.28
    03运行超市抹零结账行为money_all=67.99+11.75+21.1+8.49+25.89+17.5+22.4money_all_str=str(money_all)print("商品总金额为:",money_all_str)money_real=int(money_all)money_real_str=str(money_real)print("实收金额为:",money_real_str)print("学号后四位3126"......
  • 解决使用mitmprox抓包可以访问网页,但是使用python request 调用该网站接口报错问题
    可能有几种原因导致这种情况。以下是一些常见的问题和可能的解决方法:证书验证问题:当你使用mitmproxy抓包时,它通常会生成自签名的SSL证书,以便进行中间人攻击检查。但在Python中使用requests库时,默认情况下,它会验证SSL证书的有效性。你需要禁用SSL验证,以便使用mitmproxy生成的证书......
  • 【Python】用Python生成图像特效
    1.引用本文重点介绍如何使用python进行图像处理,生成各式各样的图像特效。闲话少说,我们直接开始吧!2.读入图像首先我们来读取我们的样例图像,并尝试打印图像中相应元素的像素值。为了实现这一点,我们使用Python中的Pillow子模块进行实现,代码如下:fromPILimportImageimg=Image.o......
  • Python 作用域:局部作用域、全局作用域和使用 global 关键字
    变量只在创建它的区域内可用。这被称为作用域。局部作用域在函数内部创建的变量属于该函数的局部作用域,并且只能在该函数内部使用。示例:在函数内部创建的变量在该函数内部可用:defmyfunc():x=300print(x)myfunc()函数内部的函数如上面的示例所解释的那样,变量x在......
  • 手把手教你用python一键抢12306火车票(附代码)
    哈喽,哈喽~,一年一度的抢火车票大战正式拉开序幕…然饿大多数人碰到的是这种情况:当你满心期待摩拳擦掌准备抢票的时候,你会发现一票难求!想回趟家真难!那么作为程序猿的你,当然要用程序猿的方式来抢票!下面分享用python来抢票!欢迎关注公众号:每日推荐系列,提供各种免费资源!也可以咨询代码问......
  • Python 作用域:局部作用域、全局作用域和使用 global 关键字
    变量只在创建它的区域内可用。这被称为作用域。局部作用域在函数内部创建的变量属于该函数的局部作用域,并且只能在该函数内部使用。示例:在函数内部创建的变量在该函数内部可用:defmyfunc():x=300print(x)myfunc()函数内部的函数如上面的示例所解释的那样,变量x......
  • python__requests模块的session对象
    *****************************************************************************************************************************************************************************************************************面试时,面试官问我:自动化中,只需要登录一次,就可以跑其......
  • python 类的继承
    假设父类:classParent(object):def__init__(self):print("打印父类")print(__class__)self.p_name="父类属性"self.p_code="10000"defget_parent_function(self):print("打印父类方法")de......
  • 【ArcPy】Python工具的参数校验
    在updateMessages方法中检查输入图层数据源的工作空间是否是本地数据,如果不是,设置错误。在updateParameters方法中从图层派生出第4个参数,即输出要素类的路径。注意该参数的类型需要是“派生(Derived)”importarcpyclassToolValidator(object):"""Classforvalidatingatoo......
  • 【Python数据可视化】2023中秋国庆电影票房数据
    ......