Java中使用Tesseract识别十六进制矩阵图片时字母C识别错误求助
Tesseract识别十六进制矩阵字符错误的解决请求
背景
我正在开发Java程序,使用bytedeco的Tesseract移植版本提取特定图片中的文本。这些图片均包含5x5至7x7的矩阵,每个元素为十六进制数。
示例原始图片:
预处理二值化后的PNG图片:
原始图片尺寸395x395,预处理后放大至790x790。使用页面分割模式6(单一均匀文本块)时,识别结果如下:
1C 55 E9 55 E9 E9 18 18 BD 18 55 E9 18 E9 55 E9 18 55 55 BD E9 10 BD 55 55
当前测试代码
private String[] analyseStep(String imagePath) { BytePointer outText; TessBaseAPI api = new TessBaseAPI(); if(api.Init(null, "eng") != 0) { throw new RuntimeException("Could not initialize Tesseract!"); } System.out.println("Analyzing: " + imagePath); PIX image = pixRead(imagePath); api.SetImage(image); outText = api.GetUTF8Text(); System.out.println("OCR result:\n" + outText.getString()); return null; }
核心问题
整体识别效果尚可,但字母“C”的识别存在严重问题:有时正确识别为“C”,有时被识别为“8”或“0”。后续需要自动处理并执行操作,识别错误会导致严重问题,需要实现零错误识别。
已尝试的优化措施
- 将图片从.jpg格式转换为.png和.tif格式
- 颜色反转
- 对比度增强
- 腐蚀与膨胀操作
- 将图片尺寸从395x395放大至790x790
- 尝试Tesseract所有页面分割模式(模式6效果最佳)
- 将矩阵拆分为5行分别识别
补充说明(疑似与识别无关)
每次运行Tesseract后,会出现以下错误信息:
Warning: Parameter not found: enable_new_segsearch ObjectCache(00007ffcf9d5a4e0)::~ObjectCache(): WARNING! LEAK! object 00000209807427e0 still has count 1 (id D:\[some folders omitted]\src\main\resources\tessdata/eng.traineddatapunc-dawg) ObjectCache(00007ffcf9d5a4e0)::~ObjectCache(): WARNING! LEAK! object 0000020980742770 still has count 1 (id D:\[some folders omitted]\src\main\resources\tessdata/eng.traineddataword-dawg) ObjectCache(00007ffcf9d5a4e0)::~ObjectCache(): WARNING! LEAK! object 0000020980742a80 still has count 1 (id D:\[some folders omitted]\src\main\resources\tessdata/eng.traineddatanumber-dawg) ObjectCache(00007ffcf9d5a4e0)::~ObjectCache(): WARNING! LEAK! object 0000020980742380 still has count 1 (id D:\[some folders omitted]\src\main\resources\tessdata/eng.traineddatabigram-dawg) ObjectCache(00007ffcf9d5a4e0)::~ObjectCache(): WARNING! LEAK! object 0000020980742850 still has count 1 (id D:\[some folders omitted]\src\main\resources\tessdata/eng.traineddatafreq-dawg)
Maven依赖配置:
<dependency> <groupId>org.bytedeco</groupId> <artifactId>tesseract-platform</artifactId> <version>5.3.1-1.5.9</version> </dependency>
手动下载的tessdata目录内容:
优化建议
限定识别字符集
明确告诉Tesseract只识别十六进制相关字符,过滤无关干扰。在初始化API后添加:api.SetVariable("tessedit_char_whitelist", "0123456789ABCDEF ");注意保留空格,适配矩阵元素间的分隔。
禁用语言模型约束
十六进制不是自然语言,无需加载字典类模型,减少错误判断:api.SetVariable("load_system_dawg", "false"); api.SetVariable("load_freq_dawg", "false");精细化预处理
- 尝试Otsu自适应阈值化替代简单二值化,确保字符轮廓清晰无断裂;
- 用中值滤波去除图片噪声:
pixMedianFilter(image, 3); - 单独裁剪每个矩阵元素并归一化到统一尺寸(如64x64像素),消除位置和大小差异带来的识别误差。
使用针对性训练数据
放弃通用的eng模型,改用digit模型配合字符白名单,或训练专门的十六进制字符小模型,能大幅提升识别准确率。修复资源泄漏
虽然警告不直接影响识别,但正确释放资源避免潜在问题,在代码末尾添加:outText.deallocate(); api.Clear(); api.End(); pixDestroy(image);
内容的提问来源于stack exchange,提问作者The Doctor
相关产品推荐
相关产品推荐

