轻松实现高精度中文OCR识别,开源神器大揭秘
2025-10-15 20:25:04
CNOCR 学习目录
1. CNOCR 简介与安装
1.1 什么是 CNOCR?
CNOCR 是一个基于深度学习的开源中文 OCR 工具,专门用于识别图像中的中文文本。它由 Breezedeus 开发,旨在为中文文本识别提供一个简单易用且高效的解决方案。CNOCR 不仅支持中文,还支持中英文混合文本的识别,适用于各种场景,如文档扫描、图像文字提取等。
1.2 CNOCR 的特点与优势
专注于中文文本识别:CNOCR 针对中文文本进行了优化,识别准确率高,尤其擅长处理复杂的中文排版和字体。
轻量级且易于使用:CNOCR 的安装和使用非常简单,只需几行代码即可完成图像文字的识别。
支持多种字体和复杂布局:无论是印刷体、手写体,还是复杂的排版布局,CNOCR 都能很好地处理。
提供预训练模型:CNOCR 提供了多个预训练模型,用户可以直接使用,无需从头训练。
高效且快速:CNOCR 基于深度学习技术,识别速度快,适合处理大量图像。
开源免费:CNOCR 是完全开源的,用户可以自由使用和修改。
1.3 环境要求与依赖安装
Python 版本要求
CNOCR 需要 Python 3.6 及以上版本。如果你还没有安装 Python,可以从 Python 官网 下载并安装。
安装 CNOCR
安装 CNOCR 非常简单,只需运行以下命令:
pip install cnocr
这个命令会自动安装 CNOCR 及其依赖项。如果你在安装过程中遇到问题,可以尝试升级 pip:
pip install --upgrade pip
1.4 验证安装是否成功
安装完成后,我们可以通过以下代码来验证 CNOCR 是否安装成功:
import cnocr
# 初始化 CNOCR
ocr = cnocr.CnOcr()
# 测试识别
test_image_path = 'test_image.png' # 请确保存在测试图片
result = ocr.ocr(test_image_path)
# 输出结果
print("CNOCR 安装成功!识别结果:")
for line in result:
print(f"文本: {
line['text']}, 位置: {
line['position']}, 置信度: {
line['score']}")
这段代码首先导入了 CNOCR 库,然后初始化了一个 CNOCR 实例。接着,它读取了一张测试图片并进行了文字识别,最后输出了识别结果。如果一切正常,你会看到识别出的文本及其位置和置信度。
2. CNOCR 基本使用
2.1 导入库与基本配置
在使用 CNOCR 之前,我们需要先导入库并进行一些基本配置。以下是一个简单的示例:
from cnocr import CnOcr
# 初始化 CNOCR 实例
ocr = CnOcr(
det_model_name='ch_PP-OCRv3_det', # 检测模型
rec_model_name='ch_PP-OCRv3_rec', # 识别模型
cand_alphabet='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' # 可选字符集
)
在这段代码中,我们导入了 CnOcr 类,并初始化了一个 CNOCR 实例。det_model_name 和 rec_model_name 分别指定了文本检测和识别模型,cand_alphabet 是可选的字符集,用于限制识别结果中的字符类型。
2.2 使用 CNOCR 进行简单的图像识别
识别单张图片
# 识别单张图片
image_path = 'example.png'
result = ocr.ocr(image_path)
# 打印识别结果
print("识别结果:")
for idx, line in enumerate(result):
print(f"第 {
idx+1} 行: {
line['text']}")
这段代码展示了如何使用 CNOCR 识别单张图片中的文字。ocr.ocr(image_path) 会返回一个包含识别结果的列表,每个元素代表一行文本及其相关信息。
识别图片中的中文文本
# 提取文本内容
texts = [line['text'] for line in result]
# 保存结果到文件
with open('output.txt', 'w', encoding='utf-8') as f:
f.write('\n'.join(texts))
print("文本已保存到 output.txt")
这段代码将识别出的文本保存到一个文本文件中,方便后续处理或分析。
2.3 输出结果的格式与解析
CNOCR 的识别结果是一个包含多个字典的列表,每个字典代表一行文本。以下是一个示例:
# 解析识别结果
for line in result:
print(f"""
文本内容: {
line['text']}
位置坐标: {
line['position']}
置信度: {
line['score']:.2f}
""")
这段代码展示了如何解析识别结果,并输出每行文本的内容、位置坐标和置信度。
2.4 处理图像路径输入与文件夹批量处理
如果你需要处理多张图片,可以使用以下代码进行批量处理:
import os
from pathlib import Path
def batch_ocr(image_folder, output_folder='output'):
"""批量处理文件夹中的图片"""
# 创建输出目录
Path(output_folder).mkdir(exist_ok=True)
results = {
}
for filename in os.listdir(image_folder):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
# 处理每张图片
image_path = os.path.join(image_folder, filename)
result = ocr.ocr(image_path)
# 保存结果
output_path = os.path.join(output_folder, f"{
Path(filename).stem}.txt")
with open(output_path, 'w', encoding='utf-8') as f:
f.write('\n'.join([line['text'] for line in result]))
results[filename] = result
return results
# 使用示例
batch_results = batch_ocr('images')
print(f"处理完成,共识别 {
len(batch_results)} 张图片")
这段代码会遍历指定文件夹中的所有图片,并将识别结果保存到输出文件夹中。
3. CNOCR 高级功能
3.1 识别图片中的中英文混合文本
CNOCR 不仅可以识别中文,还支持中英文混合文本的识别。以下是一个示例:
# 初始化支持中英文的模型
mixed_ocr = CnOcr(
det_model_name='en_PP-OCRv3_det',
rec_model_name='en_PP-OCRv3_rec'
)
# 识别混合文本
mixed_text_image = 'mixed_text.png'
result = mixed_ocr.ocr(mixed_text_image)
print("中英文混合识别结果:")
for line in result:
print(line['text'])
这段代码展示了如何使用 CNOCR 识别中英文混合文本。通过指定不同的模型,CNOCR 可以更好地处理混合文本。
3.2 识别不同字体、手写体和复杂布局的文本
CNOCR 支持识别多种字体和复杂布局的文本。以下是一个示例:
# 使用更强大的模型
advanced_ocr = CnOcr(
det_model_name='ch_PP-OCRv3_det',
rec_model_name='ch_PP-OCRv3_rec',
cand_alphabet='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
)
# 识别复杂文本
complex_image = 'complex_layout.png'
result = advanced_ocr.ocr(complex_image)
print("复杂文本识别结果:")
for line in result:
print(line['text'])
这段代码展示了如何使用更强大的模型来识别复杂文本。
3.3 调整识别精度与参数设置
图像预处理:二值化、去噪等
from cnocr.utils import read_img
import cv2
# 读取并预处理图像
img = read_img('noisy_image.png', gray=True)
# 二值化处理
_, img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 去噪
img = cv2.fastNlMeansDenoising(img, None, h=10, templateWindowSize=7, searchWindowSize=21)
# 识别处理后的图像
result = ocr.ocr(img)
print("预处理后识别结果:")
for line in result:
print(line['text'])
这段代码展示了如何对图像进行预处理,以提高识别精度。
调整识别模型的参数
# 自定义模型参数
custom_ocr = CnOcr(
det_model_name='ch_PP-OCRv3_det',
rec_model_name='ch_PP-OCRv3_rec',
cand_alphabet='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
det_model_backend='onnx', # 使用 ONNX 后端
rec_model_backend='onnx',
context='cpu' # 指定使用 CPU
)
# 使用自定义模型识别
result = custom_ocr.ocr('custom_image.png')
print("自定义模型识别结果:")
for line in result:
print(line['text'])
这段代码展示了如何自定义模型参数,以满足特定需求。
3.4 多线程与批量图像处理
from concurrent.futures import ThreadPoolExecutor
from tqdm import tqdm
def process_image(image_path):
"""处理单张图片"""
try:
result = ocr.ocr(image_path)
return image_path, [line['text'] for line in result]
except Exception as e:
return image_path, str(e)