如何检测弯曲文本的Baseline(基线)?
文本基线(Baseline)识别优化方案
问题
从含弯曲线条的文本图片中提取文本基线时,现有代码处理带下垂部分的字母(如g、p、q、y)会导致基线断裂。
现有代码的问题
原代码依赖横向长核腐蚀来聚合文本底部像素,但g、p这类字母的下垂部分会阻断腐蚀操作,无法形成连续的基线。
优化方案
核心思路
通过行定位+局部横向扫描的方式,绕开下垂字母的干扰:
- 先通过垂直投影定位每行文本的范围,聚焦到每行的底部区域
- 对每行底部区域做横向扫描,提取文本底部的连续像素,同时补近距离的断裂段
优化后代码
import cv2 as cv import numpy as np def extract_text_baseline(img_path): # 读取灰度图 src = cv.imread(img_path, cv.IMREAD_GRAYSCALE) # 自适应二值化(反转后文本为白色,背景黑色) binary = cv.adaptiveThreshold(src, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY_INV, blockSize=55, C=11) # 计算垂直投影,筛选有文本的行 vertical_proj = np.sum(binary, axis=1) row_mask = vertical_proj > 50 # 阈值可根据图片调整 row_indices = np.where(row_mask)[0] if not row_indices.size: return None # 分组连续行,得到每行的上下边界 row_groups = [] start_row = row_indices[0] for idx in range(1, len(row_indices)): if row_indices[idx] - row_indices[idx-1] > 5: row_groups.append((start_row, row_indices[idx-1])) start_row = row_indices[idx] row_groups.append((start_row, row_indices[-1])) # 创建空白图绘制基线 baseline_img = np.zeros_like(src) for top, bottom in row_groups: # 取行底部3行的区域,聚焦文本基线附近 bottom_area = binary[bottom-2:bottom+1, :] # 横向投影,找到有文本像素的列 col_mask = np.sum(bottom_area, axis=0) > 0 baseline_cols = np.where(col_mask)[0] # 补全相邻断裂段(间隔小于10的列直接填充) for i in range(1, len(baseline_cols)): gap = baseline_cols[i] - baseline_cols[i-1] if gap < 10: baseline_img[bottom, baseline_cols[i-1]:baseline_cols[i]] = 255 # 绘制基线像素 baseline_img[bottom, baseline_cols] = 255 return baseline_img # 测试执行 result = extract_text_baseline("boston_cooking_a.jpg") if result is not None: cv.imwrite("baseline_output.jpg", result) cv.imshow("Text Baseline", result) cv.waitKey(0) cv.destroyAllWindows()
方案特点
- 针对每行单独处理,不依赖跨行长操作,避免下垂字母干扰
- 自适应行定位,兼容不同行间距的文本
- 可通过调整阈值(如投影过滤阈值、断裂补全间隔)适配不同分辨率的图片
内容的提问来源于stack exchange,提问作者codeDom
相关产品推荐
相关产品推荐

