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

如何检测弯曲文本的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:13:27