当前位置: 首页 > news >正文

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

目录

        • 引言
        • 方案一:基于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 pltfig = 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 pltfig = 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 npclass CropByProject:"""投影法裁剪"""def __init__(self, threshold: int = 250):self.threshold = thresholddef __call__(self, origin_img):image = cv2.cvtColor(origin_img, cv2.COLOR_BGR2GRAY)# 反色,将大于threshold的值置为0,小于的改为255retval, 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]@staticmethoddef get_project_loc(img, direction):"""获得裁剪的起始和终点索引位置Args:img (ndarray): 二值化后得到的图像direction (str): 'width/height'Raises:ValueError: 不支持的求和方向Returns:tuple: 起始索引位置"""if direction == "width":axis = 0elif direction == "height":axis = 1else: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, i1if __name__ == "__main__":cropper = CropByProject()img_path = "equation.png"img = cv2.imread(img_path)result = cropper(img)cv2.imwrite("res.png", result)
写在最后

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

相关文章:

  • Golang Struct 继承的深入讨论和细节
  • ETCD备份与恢复
  • c# sqlite 修改字段类型
  • ssm164学院学生论坛的设计与实现+vue
  • GnuTLS recv error (-110): The TLS connection was non-properly terminated
  • leetCode 229. 多数元素 II + 摩尔投票法 + 进阶 + 优化空间
  • LeetCode刷题:27. 移除元素
  • uniapp把文件中的内复制到另一个文件中
  • RTCM数据解码
  • C# Winform编程(9)网络编程
  • 基于图像识别的自动驾驶汽车障碍物检测与避障算法研究
  • 如何批量给视频添加logo水印?
  • Cookie技术
  • 父子项目打包发布至私仓库
  • vue3 + Element-plus + Echarts 5.2 切换不更新、导出PDF不显示 解决方案
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • gcc介绍及安装
  • Java,console输出实时的转向GUI textbox
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Wamp集成环境 添加PHP的新版本
  • 大数据与云计算学习:数据分析(二)
  • 后端_ThinkPHP5
  • 简单基于spring的redis配置(单机和集群模式)
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 如何选择开源的机器学习框架?
  • 如何优雅地使用 Sublime Text
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #includecmath
  • #Z2294. 打印树的直径
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $$$$GB2312-80区位编码表$$$$
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (02)Hive SQL编译成MapReduce任务的过程
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • **CI中自动类加载的用法总结
  • .htaccess配置重写url引擎
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .net6使用Sejil可视化日志
  • .net反编译的九款神器
  • .NET简谈设计模式之(单件模式)
  • .ui文件相关
  • @Autowired 与@Resource的区别
  • @Conditional注解详解
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [2023年]-hadoop面试真题(一)
  • [Asp.net mvc]国际化