logo

如何高效使用cnocr实现竖排文字识别:简繁中文全流程指南

作者:沙与沫2025.09.19 18:44浏览量:0

简介:本文详细介绍如何使用cnocr库进行简体中文和繁体中文的竖排文字识别,包括环境准备、模型选择、图像预处理、参数配置及代码实现,助力开发者高效处理古籍、文献等竖排文本场景。

一、cnocr简介与竖排文字识别核心挑战

cnocr是由Breezedeus团队开发的开源OCR工具,专注于中文场景识别,支持简体和繁体字符集。其核心优势在于对复杂排版(如竖排、混合排版)的优化处理能力。竖排文字识别面临两大挑战:

  1. 排版方向处理:需通过算法判断文字排列方向(自上而下或自右而左),并调整识别逻辑;
  2. 字符集兼容性:需同时支持简体(GB2312)和繁体(Big5)字符集的准确识别。

cnocr通过预训练模型和方向检测模块解决上述问题。其最新版本(如v2.2+)内置了竖排识别专用模型,可直接调用。

二、环境准备与依赖安装

1. 基础环境要求

  • Python版本:3.7及以上(推荐3.8-3.10)
  • 操作系统:Windows/Linux/macOS(需支持CUDA的GPU环境以加速推理)

2. 依赖安装步骤

  1. # 创建虚拟环境(推荐)
  2. python -m venv cnocrenv
  3. source cnocrenv/bin/activate # Linux/macOS
  4. # cnocrenv\Scripts\activate # Windows
  5. # 安装cnocr(含GPU支持)
  6. pip install cnocr[gpu] # 如需CPU版本,去掉[gpu]
  7. # 验证安装
  8. python -c "import cnocr; print(cnocr.__version__)"

关键点

  • GPU版本需提前安装CUDA和cuDNN(版本匹配参考PyTorch官方文档);
  • 如遇依赖冲突,可使用pip install --upgrade --force-reinstall cnocr强制重装。

三、竖排文字识别全流程

1. 图像预处理

竖排文本识别前需完成以下预处理:

  • 方向校正:使用OpenCV检测文本主方向并旋转至水平(可选,cnocr v2.2+可自动处理);
  • 二值化:增强字符与背景对比度(推荐使用自适应阈值法);
  • 分块切割:将长竖排文本分割为单列(每列宽度≈字符平均宽度×1.5)。

示例代码(图像预处理)

  1. import cv2
  2. import numpy as np
  3. def preprocess_vertical_text(img_path):
  4. # 读取图像
  5. img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
  6. # 自适应二值化
  7. binary = cv2.adaptiveThreshold(
  8. img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
  9. cv2.THRESH_BINARY, 11, 2
  10. )
  11. # 形态学操作(可选,去除噪点)
  12. kernel = np.ones((2,2), np.uint8)
  13. cleaned = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)
  14. return cleaned

2. 模型选择与参数配置

cnocr提供两类竖排识别模型:

  • 通用模型densenet_lite_136-gru(默认,支持简繁混合);
  • 专用模型densenet_lite_136-gru-vertical(优化竖排场景)。

参数配置要点

  1. from cnocr import CnOcr
  2. # 初始化识别器(竖排专用)
  3. ocr = CnOcr(
  4. rec_model_name='densenet_lite_136-gru-vertical', # 竖排模型
  5. context='gpu', # 或'cpu'
  6. lang='ch_sim_tra', # 简繁混合字符集
  7. det_model_name='db_mv3' # 检测模型(可选)
  8. )

关键参数说明

  • lang:支持ch_sim(简体)、ch_tra(繁体)、ch_sim_tra(混合);
  • rec_model_name:竖排模型需明确指定后缀-vertical
  • det_model_name:如需自动检测文本区域,可指定检测模型(如db_mv3)。

3. 竖排文本识别实现

方法一:单列竖排识别(推荐)

将竖排文本按列分割后逐列识别:

  1. def recognize_vertical_columns(img_path, column_width=30):
  2. # 预处理
  3. img = preprocess_vertical_text(img_path)
  4. h, w = img.shape
  5. # 按列分割(假设列宽为30像素)
  6. columns = []
  7. for x in range(0, w, column_width):
  8. col = img[:, x:x+column_width]
  9. if col.shape[1] < column_width: # 补全最后一列
  10. pad_width = column_width - col.shape[1]
  11. col = np.pad(col, ((0,0), (0,pad_width)), 'constant')
  12. columns.append(col)
  13. # 逐列识别
  14. results = []
  15. for col in columns:
  16. # 旋转90度使竖排变横排(模拟cnocr内部处理)
  17. rotated = cv2.rotate(col, cv2.ROTATE_90_CLOCKWISE)
  18. res = ocr.ocr(rotated)
  19. results.extend([line[1] for line in res]) # 提取文本
  20. return ' '.join(results)

方法二:整图竖排识别(依赖模型自动处理)

直接调用竖排模型识别整图(适用于规则排版):

  1. def recognize_vertical_image(img_path):
  2. img = preprocess_vertical_text(img_path)
  3. ocr = CnOcr(rec_model_name='densenet_lite_136-gru-vertical')
  4. res = ocr.ocr(img)
  5. # 竖排结果需按列重组(示例简化处理)
  6. vertical_text = []
  7. for line in res:
  8. vertical_text.append(line[1]) # 假设模型已按竖排顺序输出
  9. return '\n'.join(vertical_text) # 每列一行

4. 简繁中文混合处理

cnocr通过lang='ch_sim_tra'参数自动处理简繁转换。如需强制输出特定字体,可在后处理阶段转换:

  1. from zhconv import convert # 需安装pip install zhconv
  2. def postprocess_text(text, target_lang='sim'):
  3. # sim:简体, tra:繁体
  4. return convert(text, target_lang)
  5. # 示例
  6. mixed_text = "這是簡體和繁體的混合文本"
  7. simplified = postprocess_text(mixed_text, 'sim') # 转为简体

四、性能优化与常见问题

1. 识别准确率提升技巧

  • 图像质量:分辨率建议≥300dpi,避免模糊或倾斜;
  • 模型微调:使用自定义数据集微调模型(参考cnocr文档);
  • 后处理规则:添加正则表达式修正常见错误(如“貝”→“贝”)。

2. 常见问题解决

  • 问题1:竖排文字被截断
    解决:调整column_width参数或使用更小的分块尺寸。

  • 问题2:繁体字识别错误
    解决:检查lang参数是否为ch_sim_tra,或单独使用ch_tra模型。

  • 问题3:GPU内存不足
    解决:降低batch_size(通过CnOcr(rec_batch_size=4)设置)。

五、完整代码示例

  1. from cnocr import CnOcr
  2. import cv2
  3. import numpy as np
  4. def main():
  5. # 1. 初始化OCR
  6. ocr = CnOcr(
  7. rec_model_name='densenet_lite_136-gru-vertical',
  8. lang='ch_sim_tra',
  9. context='gpu'
  10. )
  11. # 2. 预处理图像
  12. img_path = 'vertical_text.jpg'
  13. img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
  14. _, binary = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
  15. # 3. 分列识别(简化版)
  16. h, w = binary.shape
  17. column_width = 25 # 根据实际文本调整
  18. results = []
  19. for x in range(0, w, column_width):
  20. col = binary[:, x:x+column_width]
  21. if col.size == 0:
  22. continue
  23. # 旋转90度模拟竖排
  24. rotated = cv2.rotate(col, cv2.ROTATE_90_CLOCKWISE)
  25. res = ocr.ocr(rotated)
  26. column_text = ' '.join([line[1] for line in res])
  27. results.append(column_text)
  28. # 4. 输出结果
  29. final_text = '\n'.join(results)
  30. print("识别结果:\n", final_text)
  31. if __name__ == '__main__':
  32. main()

六、总结与扩展应用

cnocr的竖排文字识别功能通过专用模型和方向感知算法,有效解决了古籍、文献等场景的排版问题。开发者可通过以下方式扩展应用:

  1. 批量处理:结合多线程/多进程加速大规模识别;
  2. API封装:使用FastAPI或Flask构建在线识别服务;
  3. 移动端适配:通过ONNX Runtime部署至Android/iOS。

推荐资源

相关文章推荐

发表评论