You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Tesseract、EasyOCR等OCR工具提取图像中的粗体文本

OCR提取图像中仅粗体文本的实现方案

核心思路

EasyOCR本身不会直接返回文本的字体粗细属性,粗体文本的核心特征是相同字号下笔画更粗,对应文字区域的前景像素占比更高。我们可以结合OCR返回的文本坐标框,对每个文本区域做像素特征统计,筛选出粗体文本。

具体实现代码

import easyocr
import cv2
import numpy as np

IMAGE_PATH = 'captcha4.JPG'
# 粗体判定阈值,可根据实际场景调整,取值范围0-1,数值越高筛选出的文本笔画越粗
BOLD_THRESHOLD = 0.3

# 读取图像并做二值化预处理
img = cv2.imread(IMAGE_PATH)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 自适应二值化,消除光照影响
binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)

# 调用EasyOCR识别
reader = easyocr.Reader(['en'])
result = reader.readtext(IMAGE_PATH)

bold_texts = []
for item in result:
    bbox, text, conf = item
    # 提取坐标框的上下左右边界
    x_min = int(min([p[0] for p in bbox]))
    x_max = int(max([p[0] for p in bbox]))
    y_min = int(min([p[1] for p in bbox]))
    y_max = int(max([p[1] for p in bbox]))
    # 截取对应区域的二值图
    roi = binary[y_min:y_max, x_min:x_max]
    # 计算前景像素(文字部分)占比
    total_pixels = roi.shape[0] * roi.shape[1]
    foreground_pixels = np.count_nonzero(roi)
    density = foreground_pixels / total_pixels
    # 符合粗体阈值则加入结果
    if density >= BOLD_THRESHOLD:
        bold_texts.append(text)

print("提取到的粗体文本:", bold_texts)

方案说明

  • 阈值BOLD_THRESHOLD需要根据你的图像实际情况调整:如果漏选了粗体文本就调低阈值,如果混入了非粗体文本就调高阈值。
  • 如果是规范的印刷文档场景,也可以替换为Tesseract实现:调用Tesseract时指定输出hOCR格式,解析返回结果中的font-weight属性,直接筛选属性为bold的文本即可,无需额外做像素统计。
  • 针对你给出的识别结果测试:坐标为[[92, 2], [218, 2], [218, 50], [92, 50]]的EP区域面积更大、笔画更粗,会被判定为粗体文本。

内容的提问来源于stack exchange,提问作者psycho_coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:06:01