导读:本期聚焦于小伙伴创作的《如何用Tesseract.js优化多栏文本识别?活用页面分段模式PSM的方法有哪些》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何用Tesseract.js优化多栏文本识别?活用页面分段模式PSM的方法有哪些》有用,将其分享出去将是对创作者最好的鼓励。

Tesseract.js作为运行在浏览器端的OCR识别工具,能够直接处理图片中的文字内容,无需依赖后端服务,在表单识别、文档提取等场景中应用广泛。但在处理多栏排版的文档时,默认的识别模式往往会将不同栏的内容混合拼接,导致识别结果顺序混乱,准确率也会明显下降。页面分段模式PSM是Tesseract识别引擎的核心参数之一,它的作用是告诉识别引擎待处理图片的文字排版特征,合理设置该参数可以大幅提升多栏文本的识别效果。

如何用Tesseract.js优化多栏文本识别?活用页面分段模式PSM的方法有哪些

什么是PSM模式

PSM全称是Page Segmentation Mode,即页面分段模式,是Tesseract用于定义图片中文字排版结构的参数。Tesseract.js沿用了Tesseract引擎的PSM参数体系,不同的PSM值对应不同的排版假设,识别引擎会根据设定的模式调整文字检测、分块和识别的逻辑。

常用的PSM模式有以下几种:

  • PSM 0:仅方向和脚本检测,不执行识别
  • PSM 3:默认模式,自动分段页面,适合大多数单栏文本场景
  • PSM 4:假设文本是单栏可变大小的文本
  • PSM 6:假设文本是单栏统一的块
  • PSM 11:稀疏文本,没有特定顺序
  • PSM 12:稀疏文本,带OSD(方向和脚本检测)

多栏文本识别的常见问题

多栏文本指的是同一页面中存在两栏及以上独立排版的文字区域,比如常见的期刊论文、报纸版面、产品说明书等。使用默认的PSM 3模式处理这类图片时,会出现两个典型问题:

第一个是内容顺序错乱。识别引擎会按照图片中文字出现的物理位置从上到下、从左到右扫描,导致第一栏末尾的内容和第二栏开头的内容被拼接在一起,完全不符合人类阅读的多栏阅读顺序。

第二个是识别准确率下降。多栏文本的分栏间隔、不同栏的字号差异会让默认的分段逻辑失效,识别引擎可能将分栏线识别为文字,或者把相邻栏的内容错误合并为一个识别块,产生大量乱码和错误内容。

多栏文本场景下的PSM选择策略

针对不同的多栏文本特征,需要选择不同的PSM模式来优化识别效果:

规则多栏文本

如果多栏文本的栏宽固定、分栏清晰,比如标准的双栏论文,推荐使用PSM 4模式。该模式假设文本是单栏可变大小,但实际上识别引擎会更倾向于按垂直方向分块,能够较好地保持单栏内的内容顺序,后续只需要对识别结果做简单的分栏切割即可。

不规则多栏文本

如果多栏文本的分栏宽度不一致、存在图文混排,推荐使用PSM 11模式。该模式假设文本是稀疏且无固定顺序的,识别引擎会先检测所有独立的文字块,再按照块的位置排序,开发者可以拿到所有文字块的坐标信息,自行按照分栏规则排序。

带复杂排版的文档

如果文档有多栏同时还有页眉页脚、侧边标注等内容,可以先使用PSM 0做方向检测,确认图片方向正确后,再用PSM 12模式识别,该模式会在稀疏文本识别的基础上自动检测文字的方向和脚本,减少排版干扰带来的识别错误。

完整代码示例

下面是使用Tesseract.js结合PSM模式识别多栏文本的示例代码,代码中使用了PSM 11模式,并且会输出每个文字块的坐标信息,方便后续做分栏排序:

// 引入Tesseract.js
import Tesseract from 'tesseract.js';

// 多栏文本图片路径
const imagePath = 'multi_column_text.png';

// 识别函数
async function recognizeMultiColumnText() {
    try {
        // 创建worker实例
        const worker = await Tesseract.createWorker();
        // 加载英文和中文语言包,按需调整
        await worker.loadLanguage('chi_sim+eng');
        await worker.initialize('chi_sim+eng');
        // 设置PSM模式为11,稀疏文本无特定顺序
        await worker.setParameters({
            tessedit_pageseg_mode: Tesseract.PSM.SPARSE_TEXT
        });
        // 执行识别
        const { data } = await worker.recognize(imagePath);
        // 输出识别到的所有文字块
        console.log('识别到的文字块数量:', data.blocks.length);
        data.blocks.forEach((block, index) => {
            console.log(`第${index + 1}个文字块内容:`, block.text);
            console.log('文字块坐标:', block.bbox);
        });
        // 根据文字块的x坐标分栏排序
        const sortedBlocks = data.blocks.sort((a, b) => {
            // 先按x坐标排序,区分不同栏
            if (Math.abs(a.bbox.x0 - b.bbox.x0) > 50) {
                return a.bbox.x0 - b.bbox.x0;
            }
            // 同一栏内按y坐标排序
            return a.bbox.y0 - b.bbox.y0;
        });
        // 拼接最终识别结果
        const finalText = sortedBlocks.map(block => block.text).join('n');
        console.log('最终排序后的识别结果:', finalText);
        // 终止worker
        await worker.terminate();
    } catch (error) {
        console.error('识别失败:', error);
    }
}

// 执行识别
recognizeMultiColumnText();

PSM参数调优建议

在实际使用中,还可以结合其他参数进一步优化识别效果:

  • 如果图片存在倾斜,可以先做图片旋转校正,再设置PSM参数,避免方向错误影响分段逻辑
  • 可以适当调整tessedit_char_whitelist参数,设置识别白名单,减少无关字符的干扰
  • 如果识别结果中仍有少量分栏错误,可以结合文字块的宽度阈值,自动判断不同栏的边界,再做二次排序
  • 对于固定版式的多栏文档,可以提前裁剪出每一栏的区域,分别用PSM 6模式识别,准确率会更高

通过合理选择PSM模式,Tesseract.js在多栏文本识别场景下的效果可以得到明显提升,开发者可以根据实际的文档特征灵活调整参数,满足不同项目的识别需求。

Tesseract.jsPSM多栏文本识别OCR优化修改时间:2026-06-21 18:48:21

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。