如何使用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
相关产品推荐
相关产品推荐

