如何使用Java版Tesseract从图片中识别提取粗体文本
基于Java + Tesseract实现图片粗体文本提取方案
实现原理
Tesseract默认仅输出纯文本内容,要筛选粗体文本需要开启hOCR格式输出,该格式会附带每个文本块的字体属性(含字重信息),我们只需要解析hOCR内容筛选字重符合粗体标准的片段即可。
前置依赖
本地环境
- 安装Tesseract OCR 4.x及以上版本,确保已加载对应语言的训练数据
Java项目依赖
以Maven为例,引入Tess4J(Tesseract的Java封装库):
<dependency> <groupId>net.sourceforge.tess4j</groupId> <artifactId>tess4j</artifactId> <version>5.8.0</version> </dependency>
核心实现步骤
- 初始化Tesseract实例,开启hOCR输出和字体信息返回配置
TessBaseAPI api = new TessBaseAPI(); // 替换为你的tessdata目录路径 api.init("你的tessdata目录路径", "eng"); // 开启hOCR输出,同时返回字体信息 api.setHocr(true); api.setVariable("hocr_font_info", "1");
- 加载待识别图片,执行识别获取hOCR内容
File imageFile = new File("待识别图片路径"); BufferedImage image = ImageIO.read(imageFile); api.setImage(image); // 获取hOCR格式的XML结果 String hocrContent = api.getHOCRText(0); api.end();
- 解析hOCR内容,筛选粗体文本
hOCR中每个文本行的class='ocrx_word'节点会携带title属性,其中font-weight字段对应字重,字重≥700即为粗体,你可以用Jsoup等XML解析库筛选符合条件的节点文本:
Document doc = Jsoup.parse(hocrContent); Elements words = doc.select(".ocrx_word"); StringBuilder boldText = new StringBuilder(); for (Element word : words) { String title = word.attr("title"); // 提取font-weight数值 Pattern pattern = Pattern.compile("font-weight (\\d+)"); Matcher matcher = pattern.matcher(title); if (matcher.find()) { int weight = Integer.parseInt(matcher.group(1)); if (weight >= 700) { boldText.append(word.text()).append(" "); } } } // 输出筛选后的粗体文本,示例场景下会得到 "Thanksgiving" System.out.println(boldText.toString().trim());
优化提示
如果识别场景中字体信息返回准确率低,可以提前对图片做预处理:先二值化后统计文本连通域的笔画宽度,粗体文本的笔画宽度比普通文本高30%以上,筛选对应区域后再做识别,可以大幅提升粗体提取的准确率。
内容的提问来源于stack exchange,提问作者k shiva
相关产品推荐
相关产品推荐

