简介:在自动化脚本中,实现对屏幕数字的准确识别是常见且关键的需求。本文将介绍一种基于图像二值化与自定义字库的文字识别思路,帮助读者理解从截图、色块选取、点阵提取到字库验证的完整流程,从而提升脚本对终端数字内容的识别稳定性。
在自动化测试、终端交互或桌面脚本场景中,经常需要脚本读取屏幕上显示的数字。例如,在终端窗口中输入“123”,脚本需要识别并返回“123”这个字符串,而不是简单截图比对。与固定坐标取色相比,文字识别更适合处理动态变化的内容,尤其是数字长度不固定、显示位置可能偏移的情况。
常见的屏幕文字识别方案包括:
本文重点讨论第三种思路。它的核心逻辑是:将屏幕上的目标区域转换为黑白二值图像,再从中提取字符点阵;每个字符点阵对应一个自定义编码;当脚本再次捕获到相同或高度相似的点阵时,便返回对应编码所表示的文字。这种方式对字体、字号、颜色相对固定的场景非常有效,也便于用户自行维护和扩充识别库。
在开始制作字库之前,需要准备一套支持屏幕取图、二值化、点阵提取和字符定义的工具。许多自动化测试平台或按键模拟框架都会内置类似功能,也可以通过通用图像采集与处理逻辑自行搭建。
首先需要创建一个空字库文件。字库文件用于保存“点阵特征—文字含义”的映射数据。可以将其命名为 test.txt 或其他便于管理的名称。文件名本身不影响识别能力,但建议保持简洁,并在后续脚本中明确指定加载路径。
初始化完成后,需要先截取一张包含目标数字的屏幕图片。截图时最好让目标区域尽量干净,减少背景干扰。若终端窗口包含较多边框、提示文字或装饰元素,会显著增加二值化后的噪点,影响后续点阵提取。
进入抓图模式后,使用鼠标框选目标区域。框选范围应尽量贴近需要识别的数字本身,而不是整个终端窗口。过大的截图范围可能包含以下干扰项:
框选完成后,按下回车键保存图片。此时左侧预览窗口会显示刚刚截取的画面。如果发现截取范围仍然偏大或包含干扰内容,应立即重新截取,而不是继续在不理想的图像上调整参数。实践中,先缩小范围再处理,能显著提升后续步骤效率。
图像二值化是将彩色或灰度图像转换为黑白两色的过程。对于带有颜色的数字文本,需要告诉工具“哪种颜色属于有效文字像素,哪种颜色属于背景”。
操作时,先在颜色方框区域选择一个颜色样本,再将鼠标移动到预览图中的数字笔画上,左键点击一次。此时二值化区域会尝试以该颜色为基准,将相似像素标为有效前景,其余像素标为背景。
如果预览结果中数字轮廓清晰、背景干净,说明颜色选择合理。如果出现大量噪点、断裂或粘连,可以尝试:
需要注意的是,二值化结果直接决定后续点阵质量。一个模糊、破碎的二值化图像无法生成稳定可靠的字库记录。
二值化区域显示正常后,即可执行点阵提取。点阵提取的本质,是把二值化图像中的连通区域分割成独立字符块,并转换为特征数据。
通常提供两种提取方式:
无论使用哪种方式,程序此时只知道“这是一组像素构成的图案”,但并不知道这些图案代表什么含义。因此,需要在定义文字输入框中为该图案输入对应的真实字符含义,例如数字“1”。
输入完成后,必须按下回车键保存。回车键在这里承担确认写入字库的作用。保存成功后,字库数量会增加一条记录,同时界面中会显示“|”左侧为该图案对应的中文含义或字符编码。例如:
1|101001000100001111100010000100001
左侧“1”即后期识别时返回的字符,右侧为该字符的点阵特征编码。
单个数字识别能力有限。对于任意长度的整数或小数,需要提前为所有可能出现的字符建立字库。如果目标内容只涉及整数,通常需要制作数字“0”到“9”共十个字符。
每个字符的制作流程保持一致:
为了提升准确率,还可以为同一个字符在不同显示状态下制作多条记录。例如字体颜色变化、屏幕亮度差异、终端主题切换等,都可能导致同一数字的二值化结果不同。此时可以分别制作多组点阵,均标注为相同字符。脚本在匹配时只要命中任意一条记录,即可返回对应含义。
完成字库制作后,不建议立即进入脚本编写阶段。更稳妥的做法是进行独立验证。
再次截取一张新的、包含数字的屏幕图片,尽量选择与训练时不同的数值,例如使用“456”或“789”做盲测。观察二值化区域中,工具能否自动将图像中的数字与字库已有记录进行匹配,并在显示区域输出对应的字符含义。
验证时重点关注以下情况:
如果识别结果与预期一致,说明字库已经具备基本可用性。如果出现错误或漏识别,应回到对应字符的制作步骤重新截取、重新定义,而不是直接在脚本中通过代码逻辑修补。
字库验证通过后,即可在自动化脚本中加载字库文件,并调用文字识别接口对指定屏幕区域进行识别。一般流程如下:
示意性伪代码如下:
load_lib("test.txt")text = ocr_region(x, y, w, h)print(text)if text == "123":do_something()
实际接口名称和参数设置以所用平台或工具为准。核心逻辑是:字库文件必须正确加载,识别区域必须与训练时的显示环境尽量一致。
在实际使用中,可能遇到以下问题:
识别不到任何字符
检查二值化颜色是否选择正确、截图区域是否包含文字、字库文件是否已正确加载。
字符被错误拆分或合并
尝试调整截图范围,或使用手动提取单个字符的方式逐一训练。字符间距过小、字体粘连都会影响自动拆分效果。
同一数字在不同位置识别结果不一致
可能是屏幕渲染差异引起。建议在不同区域、不同时间多次截图训练同一字符,增加字库容错性。
识别速度慢
缩小识别区域、减少字库冗余记录、优化脚本调用频率,都有助于提升整体执行效率。
基于二值化与自定义字库的文字识别方法,适用于屏幕字体规范、颜色稳定、显示环境可控的自动化场景。它的优点在于实现简单、依赖较少、维护灵活,用户可以根据实际需求随时扩充字符集合。
完整流程可以概括为:初始化字库、截图取样、选择颜色、二值化处理、提取点阵、定义字符、反复扩充、独立验证、脚本集成。每一步都直接影响最终识别效果,因此应保持耐心,尤其在小范围截图和字库验证环节多花时间,能够大幅降低后期排查成本。