简介:在自动化脚本开发中,屏幕文字识别常用于读取终端、界面或图像中的数字与字符。本文围绕截取目标区域、二值化处理、点阵提取与字库构建等步骤,系统说明如何基于通用识别思路完成数字识别。读者可了解从图像采集到特征提取的完整流程,并掌握提升识别准确率的关键参数调节方法。
在自动化测试、RPA(机器人流程自动化)以及部分运维辅助脚本中,经常需要从屏幕上读取动态变化的数字或文字。例如,终端窗口中输出的编号、验证码、计数结果,或者客户端界面上的状态码。脚本如果无法获取底层接口数据,就需要通过屏幕文字识别的方式解析可见内容。
本文以“终端输入数字 123,脚本自动识别出 123”为目标,介绍一种较为通用的屏幕文字识别实践流程。核心思路包括:
整个过程不依赖特定商业软件的独有接口,而是还原其背后的图像处理与特征匹配原理。即使使用不同工具,也可以按照相同思路完成字库训练和识别配置。
一个完整的屏幕文字识别流程通常包含以下步骤:
下面逐一展开说明。
首先需要从屏幕上截取待识别区域。通常可以启动一个“抓图”或“截图”功能,然后使用鼠标框选目标范围。如果要识别终端数字,应尽量让框选区域仅覆盖数字本身,而不是整个终端窗口。
原因在于,背景中如果包含边框、滚动条、光标、菜单文字或其他界面元素,会增加后续颜色过滤的难度。例如,如果背景中同时存在白色文字、灰色边框和彩色图标,二值化后可能产生大量干扰点。将截图范围缩小到数字所在的一行或一小块区域,可以有效降低误识别概率。
实际操作建议如下:
如果发现截图中干扰信息较多,应重新截取更精确的区域,而不是执着于在后续环节反复调整。
截图完成后,图像通常是彩色位图。文字识别通常不需要完整颜色信息,因此需要将图像转换为黑白二值图。关键问题是:哪些像素属于“目标文字”,哪些属于“背景”。
一般做法是先选择一个颜色范围或颜色值,再将接近该颜色的像素视为目标像素。例如,如果数字是白色,就选取白色作为目标颜色。选定后,工具会将匹配颜色的像素显示为一种状态,不匹配的显示为另一种状态。
具体操作可以概括为:
容差是影响二值化效果的重要参数。容差较小时,只有与所选颜色非常接近的像素才会被判定为目标;容差较大时,相近颜色也可能被包含进来。对于黑白分明的终端数字,可以使用较小容差;对于渐变字体或带阴影的文字,则需要适当增大容差。
二值化完成后,预览区域应尽量呈现“只有目标文字为一种颜色,背景为另一种颜色”的状态。这是后续提取点阵的基础。
二值化图像中,目标文字由一组有效像素点构成。为了让脚本识别这些文字,需要将像素点转换为点阵模型。
点阵可以理解为一个二维网格。例如,一个字符可以被归一化为若干行、若干列的网格,每个格子记录“有像素”或“无像素”。程序在识别时,不再查看原来的彩色截图,而是读取这个点阵并与已有字库逐个比较。
在训练阶段,常见做法有两种:
将当前二值化区域中的所有目标像素作为一个整体提取。这种方式适合截图中只有一个字符,或者所有字符需要作为整体识别的情况。
当截图中含有多个字符时,工具会尝试根据字符之间的空隙自动拆分。例如,截取到“123”时,应拆分为“1”“2”“3”三个独立字符。拆分依据通常是列投影或连通域分析。
自动拆分效果好坏的判断标准是:每个字符是否完整、字符之间是否发生粘连、单个字符是否被错误切开。如果拆分不准确,可以尝试以下方法:
对于数字识别,建议尽量保证字符之间有足够间距。终端字体通常是等宽字体,字符边界明显,比较适合自动拆分。
字库是文字识别系统的核心数据文件,用于保存“字符名”与“点阵特征”的对应关系。例如:
构建字库时,需要为每个拆分出来的字符指定真实含义。例如,当工具拆分出三个字符后,应分别命名为“1”“2”“3”。命名之后,点阵数据就被写入字库文件。
一个完整的数字字库通常应包含 0 到 9 共十个字符。如果待识别内容还包含小数点、负号、冒号等符号,也需要在字库中补充。可以在不同时间、不同界面状态下多次截图,以覆盖字符的形态变化。
字库文件创建后,后续识别即可复用。首次配置可能稍显繁琐,但完成后可以持续用于同一类界面或字体。
建立字库后,应进行识别验证。例如,在终端输入不同数字组合,运行脚本观察识别结果是否与输入一致。如出现误识别或无法识别,可以从以下几个方面排查:
如果脚本运行时截图位置与训练时不一致,可能导致字符被截断或混入背景。应确保识别区域固定,或使用相对坐标、窗口定位等方式保持一致性。
不同终端主题、字体大小、缩放比例都会改变字符点阵。一旦界面字体发生变化,原有字库可能失效。建议固定被识别窗口的字体设置。
深色模式、高亮选中状态、半透明背景都会影响文字颜色。二值化参数需要根据实际环境重新调整。
数字“1”与相邻数字距离过近时,容易被合并;数字“0”内部空洞较多时,也可能被拆成多个部分。可以调整拆分算法或改用手动分区。
如果只训练了部分数字,遇到其他字符自然会失败。需要补充对应点阵。
在实际开发中,屏幕文字识别并不总是稳定可靠。以下几点经验有助于提升识别率:
对于“终端输入 123,脚本识别出 123”这一需求,从工程角度看,最好优先考虑读取系统输入缓冲、进程输出、终端伪终端数据流或日志记录。屏幕文字识别更适合作为补充手段,用于无法获取内部数据时。
虽然不同工具在菜单名称、快捷键和具体交互上存在差异,但屏幕文字识别的基本原理是相通的:截取图像、颜色过滤、二值化、提取特征、构建映射、匹配识别。掌握这套流程后,开发人员可以在不同平台和工具中快速完成字库训练。
例如,在云主机的自动化运维场景中,可能需要对控制台截图进行解析;在桌面端流程自动化中,可能需要对客户端界面中的编号进行读取;在测试脚本中,也可能需要校验终端输出是否符合预期。这些场景都可以使用本文所述方法进行适配。
未来,基于深度学习的文字识别方法可以进一步提升复杂背景下的识别能力。但在目标区域可控、字体固定的脚本场景中,基于点阵特征的本地字库方案仍然具有轻量、快速、可解释性强等优势,依然是很多开发者的常用选择。
屏幕文字识别并不是简单的“截一张图就能识别”,而是一个涉及图像预处理、颜色过滤、二值化、字符拆分、特征提取和字库维护的系统过程。只有把每个环节都控制好,才能获得稳定可靠的识别效果。
对于需要在脚本中识别终端数字的开发者,建议先固定拍摄区域和字体环境,再按照训练字库、验证结果、逐步优化的顺序推进。当底层数据可获取时,应优先使用数据接口;当无法获取时,再将屏幕识别作为可靠的兜底方案。