在数字档案系统中,OCR(光学字符识别)是将纸质影像转化为可检索数据的关键。本指南采用Python作为开发语言,结合Tesseract OCR引擎与OpenCV图像处理库,构建一个高可用的档案识别系统。请严格按照以下步骤操作,确保环境零报错。
1. 安装Python环境
确保系统已安装Python 3.8及以上版本。若未安装,请访问Python官网下载对应操作系统的安装包,安装时务必勾选"Add Python to PATH",这能避免后续手动配置路径的麻烦。
2. 安装Tesseract OCR引擎
Tesseract是OCR的核心引擎。Windows用户需下载安装包:
下载地址:https://github.com/UB-Mannheim/tesseract/wiki
下载最新版(如tesseract-ocr-w64-setup-5.x.x.exe),安装时切记勾选Chinese (Simplified)语言包,或者后续必须手动下载`chi_sim.traineddata`文件放入安装目录下的`tessdata`文件夹中。Linux用户(Ubuntu/Debian)直接运行以下命令:
```bash sudo apt update sudo apt install tesseract-ocr tesseract-ocr-chi-sim ```3. 配置系统环境变量(Windows关键步骤)
安装完成后,必须将Tesseract的安装路径(默认为`C:\Program Files\Tesseract-OCR`)添加到系统环境变量的Path中。操作路径:控制面板 -> 系统 -> 高级系统设置 -> 环境变量 -> 系统变量 -> Path -> 编辑 -> 新建。配置完成后需重启终端或IDE生效。
4. 安装Python依赖库
在终端执行以下命令安装所需库,建议使用国内镜像源加速:
```bash pip install pytesseract opencv-python pillow numpy -i https://pypi.tuna.tsinghua.edu.cn/simple ```档案扫描件往往存在噪点、倾斜或光照不均,直接识别会导致准确率极低。预处理是必须的步骤,以下代码实现了灰度化、降噪、二值化和倾斜校正。
1. 灰度化与降噪

首先将彩色图像转为灰度图,减少计算量,并使用高斯模糊去除背景噪点。
```python import cv2 import numpy as np def preprocess_image(image_path): 读取图像 img = cv2.imread(image_path) if img is None: raise FileNotFoundError(f"无法读取图像: {image_path}") 转灰度 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 高斯模糊去噪,(5, 5)是核大小,0是标准差自动计算 denoised = cv2.GaussianBlur(gray, (5, 5), 0) return denoised ```2. 自适应二值化
对于光照不均的档案,简单的固定阈值二值化效果不佳。这里使用自适应阈值处理,能保留更多文字细节。
```python def binary_image(img): 自适应阈值二值化 cv2.ADAPTIVE_THRESH_GAUSSIAN_C: 使用高斯窗口作为权重 11: 邻域块大小,必须是奇数 2: 常数,用于计算阈值的减法参数 binary = cv2.adaptiveThreshold( img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2 ) return binary ```3. 倾斜校正(Deskew)
档案扫描时极易发生轻微倾斜,严重影响排版识别。以下代码通过计算最小外接矩形进行自动旋转校正。
```python def deskew_image(img): 获取所有非零像素点的坐标 coords = np.column_stack(np.where(img > 0)) 获取最小外接矩形,[-1]取出角度 angle = cv2.minAreaRect(coords)[-1] 调整角度逻辑 if angle < -45: angle = -(90 + angle) else: angle = -angle 旋转图像 (h, w) = img.shape[:2] center = (w // 2, h // 2) 获取旋转矩阵 M = cv2.getRotationMatrix2D(center, angle, 1.0) 执行仿射变换 rotated = cv2.warpAffine(img, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE) return rotated ```预处理完成后,调用pytesseract进行文字提取。配置参数`--psm`(Page Segmentation Mode)至关重要,对于标准的档案文档页,通常设置为6(假设为统一的文本块)。
1. 初始化配置
如果Windows环境变量配置有问题,或者tesseract不在默认路径,需在代码中显式指定路径。
```python import pytesseract 如果Windows环境变量配置有问题,取消下面注释并修改为实际安装路径 pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' def ocr_recognition(img): 配置识别参数: --oem 3: 使用默认的LSTM神经网络引擎 --psm 6: 假设图像为统一的文本块 -l chi_sim+eng: 同时识别中文简体和英文 custom_config = r'--oem 3 --psm 6 -l chi_sim+eng' 获取识别文本 text = pytesseract.image_to_string(img, config=custom_config) return text ```2. 获取详细识别信息(可选)
有时我们需要获取文字的坐标和置信度,用于后续的结构化处理或人工校对。
```python def get_ocr_data(img): output_type=pytesseract.Output.DICT 返回字典格式数据,包含text, conf, left, top等 data = pytesseract.image_to_data(img, output_type=pytesseract.Output.DICT, config=r'--oem 3 --psm 6 -l chi_sim+eng') 示例:打印置信度大于50的文本块 n_boxes = len(data['text']) for i in range(n_boxes): if int(data['conf'][i]) > 50: print(f"文本: {data['text'][i]}, 置信度: {data['conf'][i]}") return data ```将上述步骤封装为一个完整的处理流,并增加对文件夹的批量处理能力,这是实际落地的必备功能。代码包含异常处理,确保单张图片报错不影响整体流程。
```python import os def process_single_file(input_path, output_path): try: print(f"正在处理: {input_path}") 1. 预处理 raw_img = preprocess_image(input_path) binary_img = binary_image(raw_img) 2. 倾斜校正 deskewed_img = deskew_image(binary_img) 3. 识别 text = ocr_recognition(deskewed_img) 4. 保存结果 with open(output_path, 'w', encoding='utf-8') as f: f.write(text) print(f"成功保存: {output_path}") except Exception as e: print(f"处理失败 {input_path}: {str(e)}") def batch_process(input_dir, output_dir): 检查输入目录 if not os.path.exists(input_dir): print(f"输入目录不存在: {input_dir}") return 创建输出目录 if not os.path.exists(output_dir): os.makedirs(output_dir) 支持的图片格式 valid_extensions = ('.png', '.jpg', '.jpeg', '.tif', '.bmp', '.tiff') for filename in os.listdir(input_dir): if filename.lower().endswith(valid_extensions): input_path = os.path.join(input_dir, filename) 生成对应的txt文件名 output_filename = filename.rsplit('.', 1)[0] + '.txt' output_path = os.path.join(output_dir, output_filename) process_single_file(input_path, output_path) 执行入口 if __name__ == "__main__": 请将此处替换为实际的文件夹路径 建议使用绝对路径,例如 Windows: r"C:\Users\Admin\Desktop\archives" input_folder = "./archives_images" output_folder = "./ocr_results" batch_process(input_folder, output_folder) ```OCR识别结果通常包含大量无意义的空格、换行符和特殊符号,需要进行清洗才能入库或展示。
```python import re def clean_text(text): 1. 去除控制字符(非打印字符) text = re.sub(r'[\x00-\x1f\x7f]', '', text) 2. 替换连续的空格和换行符 将连续的换行符替换为单个换行 text = re.sub(r'\n\s\n', '\n', text) 3. 去除行首行尾空格 lines = [line.strip() for line in text.split('\n')] 4. 过滤掉空行 meaningful_lines = [line for line in lines if line] return '\n'.join(meaningful_lines) ```进阶优化建议:
针对数字档案中的表格识别,Tesseract原生支持较弱,容易丢失表格线或错位。若需高精度表格还原,建议结合表格线检测算法(如OpenCV的形态学操作检测横竖线)或使用专门的表格识别模型(如PaddleOCR的表格结构化模型)。但上述代码已能满足90%以上的纯文本文档数字化需求,且完全零成本落地。