网站首页/ 信息中心/ 档案百科/

手把手教你搭建数字档案OCR系统,包含完整代码

发布时间:2026年06月18日 11:15:02 浏览量:0

一、核心环境搭建与依赖配置

在数字档案系统中,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. 灰度化与降噪

手把手教你搭建数字档案OCR系统,包含完整代码

首先将彩色图像转为灰度图,减少计算量,并使用高斯模糊去除背景噪点。

```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 ```

三、OCR核心识别与配置

预处理完成后,调用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%以上的纯文本文档数字化需求,且完全零成本落地。

档案OCR服务:搞定老档案数字化的靠谱实用帮手
档案OCR服务:搞定老档案数字化的靠谱实用帮手
家人们,谁懂啊,去年公司要整理2000年到2010年的老档案,我这个打杂的小员工直接头大到爆炸——那堆东西就像我奶奶家阁楼的旧冬装,堆得比我人还高,翻的时候灰尘满天飞,找一份2005年的员工合同,差点...
2026年06月18日 11:15:02
选靠谱的综合档案管理系统公司,得盯准这几个关键维度
选靠谱的综合档案管理系统公司,得盯准这几个关键维度
别不信,很多公司踩过的坑,你大概率也能中。花几万块买的综合档案管理系统,平时躺平啥事儿没有,一到要调离职员工的劳动合同、资质档案,要么搜不到,要么导出来的是乱码,还得让行政小姐姐熬夜翻旧纸箱补,这不纯...
2026年06月18日 11:15:02
微信咨询
电话联系
QQ客服
微信咨询一对一服务
服务热线: 028-8744 4417
QQ客服: 2305721818