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

news2024/11/24 14:00:52

目录

        • 引言
        • 方案一:基于LaTeX环境
        • 方案二:基于KaTeX
        • (推荐) 方案三:基于Matplotlib
        • 写在最后

引言

近来,涉及到一些公式识别的项目,输入是公式的图像,输出是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代码,大概思路是:

公式LaTeX字符串
Matplotilb渲染得到图像
裁剪多余部分
只有公式的图像

整体流程图如下:
在这里插入图片描述
相关代码如下:
借助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)
写在最后

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1144930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小程序如何设置首选配送公司

小程序的一个重要环节就是配送服务。为了提供更好的发货体验,避免商家总是要在众多的配送公司中选择想要,小程序支持设置首选配送。下面将具体介绍一下小程序如何设置。 在小程序管理员后台->配送设置->首选配送处,指定需要设置的首选…

如何使用gpt提高效率

如何使用gpt提高效率 自动化替代人力工作减少创意工作需求技术依赖风险实际应用领域内容生成自动回答问题自动化编程个性化推荐 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客👦🏻 《java 面试题大全》 🍩惟余辈才疏学浅&…

Linux进程控制(一)

前言:Linux进程控制是指在Linux操作系统中,对进程的创建、运行、管理和终止等方面进行控制的一系列机制和技术。Linux作为一个多任务操作系统,能够同时运行多个进程任务的执行,继前面我们对Linux进程创建的学习之后,今…

【多线程面试题 六】、 如何实现线程同步?

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官: 如何实现线程同步&…

Linux touch命令:创建文件及修改文件时间

既然知道了如何在 Linux 系统中创建目录,接下来你可能会想在这些目录中创建一些文件,可以使用 touch 命令。 需要注意的是,touch 命令不光可以用来创建文件(当指定操作文件不存在时,该命令会在当前位置建立一个空文件&…

“第五十三天”

今天没有做什么,不过这个在打印,的时候一直卡着,我一直在想把逗号打印在后面,所以一直想办法确定最后一个是哪一位,这里居然没有绕过来其实可以看做是前面,这样第一个不打印逗号,后面打印就可以…

【笔录】TVP技术沙龙:寻宝AI时代

目录 引言大模型的应用案例大模型三问模型落地可行性考量维度AIGC的几个可行应用方向 引言 大模型是10倍的机会,但并不是平均主义的机会,没有低垂的果实。 企业想在大模型的赛道上跑出成绩,应该怎么做,又要选择哪些赛道&#xff1…

postgresSQL 数据库本地创建表空间读取本地备份tar文件与SQL文件

使用pgAdmin4,你安装PG得文件夹****/16/paAdmin 4 /runtime/pgAdmin4.exe 第一步:找到Tablespaces 第二步:创建表空间名称 第三步:指向数据文件 第四步:找到Databases,创建表空间 第五步:输入数…

矩阵按键简单使用

1、写矩阵按键(下面在按这个格式把别的行也写入进去) 2、在LCD中显示

听GPT 讲Rust源代码--library/std(7)

题图来自 Programming languages: How Google is using Rust to reduce memory safety vulnerabilities in Android[1] File: rust/library/std/src/sys/unix/kernel_copy.rs 在Rust的标准库中,kernel_copy.rs文件位于sys/unix目录下,其主要作用是实现特…

全志T113-S3 裸机SMHC eMMC读写问题记录

由于全志的资料实在太少,很多只能通过很长时间测试才能知道问题,目前还没有实现时钟初始化,只使用了默认的24MHz时钟,测试eMMC读写过程中遇到2个问题; 问题1:读取扇区的时候,会遇到数据停止位错…

python 笔记:h5py 读取HDF5文件

1 HDF5文件 HDF5 是 Hierarchical Data Format version 5 的缩写,是一种用于存储和管理大量数据的文件格式一个h5py文件可以看作是 “dataset” 和 “group” 二合一的容器 dataset : 数据集,像 numpy 数组一样工作group : 包含了其它 dataset 和 其它 …

双11数码好物盘点、实用不踩坑的数码好物推荐

每年的双11都是买数码产品的最佳时间,因为很多外设产品的在双11都有很不错的降价空间,今天就列出几款适合双11购买的数码产品吧! 1、不用入耳佩戴的开放式耳机 -官方售价:199 推荐理由: 要推荐的是这款健康舒适的开…

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-屏幕监控

红队专题 招募六边形战士队员[24]屏幕监控-(1)屏幕查看与控制技术的讲解图像压缩算法图像数据转换其他 [25]---屏幕监控(2)查看屏幕的实现 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 [24]屏幕监控-(1)屏幕查看与控制技术的讲解 屏幕…

分布式锁-Redis红锁解决方案

一 分布式锁的概念 1:概念 分布式锁(多服务共享锁) 在分布式的部署环境下,通过锁机制来让多客户端互斥的对共享资源进行访问控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或同一个系统的不同主机之间共…

Oracle数据库设置归档模式(超级简单)

1、打开监听 查看监听的状态,如果没打开监听需要打开监听,如果打开直接下一步 lsnrctl status 打开监听 lsnrctl start 2、启动数据库 首先进入数据库 sqlplus /nolog 然后连接管理员 conn / as sysdba 3、查看当前模式 archive log list 可以…

Spring5学习笔记—CGlib动态代理

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Spring专栏 ✨特色专栏: M…

Linux UWB Stack实现——FiRa会话状态机

在FiRa标准中,很重要的一个概念就是FiRa会话以及会话的管理,本文主要介绍了在Linux UWB Stack实现中,FiRa会话状态机管理的实现。 在FiRa中,会话分为INIT、DEINIT、ACTIVE、IDLE四种状态,其定义如下。 enum fira_sess…

2023年上半年上午易错题(软件设计师考试)

计算机中,系统总线用于 (1) 连接。 A. 接口和外设 B. 运算器、控制器和寄存器 C. CPU、主存及外设部件 D. DMA控制器和中断控制器 在由高速缓存、主存和硬盘构成的三级存储体系中,CPU执行指令时需要读取数据,那…

常用JQuery插件汇总

Jquery插件,数字动画特效,从n到m数字跳动JJ​​​​​​​CountUp.jsA javascript class that animates a numerical value by counting to it.http://inorganik.github.io/countUp.js/