宿州档案数字化实战:从零构建OCR识别与归档系统

一、开发环境与核心依赖安装

在开始宿州档案数字化项目开发前,必须先配置好基础运行环境。本方案基于Python 3.8环境,利用Tesseract OCR引擎进行中文识别,配合OpenCV进行图像预处理。请严格按照以下步骤执行安装,确保环境零报错。

1. 安装Python与Tesseract引擎

Python环境建议直接从官网下载3.8或3.9版本Windows installer安装。重点在于Tesseract OCR引擎的安装,它是识别的核心。

  • 下载Tesseract:前往 https://github.com/UB-Mannheim/tesseract/wiki 下载 tesseract-ocr-w64-setup-5.3.0.20221207.exe(64位版本)。
  • 安装配置:安装时务必勾选 Chinese (Simplified)Chinese (Simplified, Vertical) 语言包,否则无法识别中文。安装路径建议不要包含空格,默认 C:\Program Files\Tesseract-OCR 即可。
  • 环境变量配置:C:\Program Files\Tesseract-OCR 添加到系统Path环境变量中。重启CMD窗口,输入 tesseract --version 验证安装成功。

2. 安装Python依赖库

在项目根目录下打开终端,执行以下命令一次性安装所需依赖库。不要使用虚拟环境以外的库,避免版本冲突。

```bash pip install pytesseract opencv-python pillow pymysql numpy ```

二、图像预处理算法实现

宿州档案多为纸质扫描件,往往存在噪点、倾斜或光照不均问题。直接上OCR识别率极低,必须进行预处理。我们将编写一个工具类,专门处理图像灰度化、去噪和二值化。

1. 图像灰度与去噪

创建名为 img_processor.py 的文件。首先将彩色图像转为灰度图,减少计算量,然后使用高斯模糊去除椒盐噪点。

```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) blur = cv2.GaussianBlur(gray, (5, 5), 0) return blur ```

2. 自适应二值化处理

针对老旧档案字迹褪色问题,简单的固定阈值二值化效果差。必须使用自适应阈值处理,根据像素邻域块的均值来动态计算阈值,保证字迹清晰。

```python def binary_image(img_gray): 使用Otsu算法进行二值化,或者自适应阈值 这里使用自适应阈值,效果对光照不均的文档更好 blockSize必须为奇数,C是减去的常数,用于微调 thresh = cv2.adaptiveThreshold( img_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2 ) return thresh ```

三、OCR文字识别核心代码

预处理完成后,调用pytesseract接口进行识别。这里的关键是配置正确的参数,特别是针对中文档案的识别。

1. 配置识别参数

宿州档案数字化实战:从零构建OCR识别与归档系统

创建 ocr_engine.py。Tesseract识别中文需要指定 lang='chi_sim'(简体中文)。同时,配置 --psm 6 参数,假设图像为统一的文本块。

```python import pytesseract from PIL import Image import os 指定tesseract.exe的路径,如果未配置环境变量则必须指定 pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' def extract_text_from_image(processed_img): 将OpenCV图像格式转换为PIL Image格式 pil_img = Image.fromarray(processed_img) 配置识别参数:chi_sim(简体中文),psm 6(假设为单行文本块) custom_config = r'--oem 3 --psm 6 -l chi_sim+eng' try: text = pytesseract.image_to_string(pil_img, config=custom_config) return text.strip() except Exception as e: print(f"OCR识别失败: {e}") return "" ```

四、MySQL数据库设计与连接

识别出的文本需要结构化存储。我们设计一个简单的归档表,用于存储档案文件名、识别内容和入库时间。

1. 建表SQL语句

在MySQL数据库中执行以下SQL,创建数据库和表。数据库名设为 suzhou_digital_archive

```sql CREATE DATABASE IF NOT EXISTS suzhou_digital_archive DEFAULT CHARSET utf8mb4; USE suzhou_digital_archive; CREATE TABLE IF NOT EXISTS archive_records ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', file_name VARCHAR(255) NOT NULL COMMENT '原始档案文件名', file_path VARCHAR(500) NOT NULL COMMENT '文件存储路径', ocr_content TEXT COMMENT '识别出的文本内容', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '入库时间', INDEX idx_file_name (file_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='宿州档案数字化记录表'; ```

2. 数据库连接工具类

创建 db_manager.py。封装数据库连接和插入操作,使用 pymysql 驱动。请修改以下代码中的 hostuserpassword 为你实际的数据库信息。

```python import pymysql class DBManager: def __init__(self): self.connection = pymysql.connect( host='localhost', user='root', 请替换为实际用户名 password='password', 请替换为实际密码 database='suzhou_digital_archive', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor ) def insert_record(self, file_name, file_path, ocr_content): try: with self.connection.cursor() as cursor: sql = "INSERT INTO archive_records (file_name, file_path, ocr_content) VALUES (%s, %s, %s)" cursor.execute(sql, (file_name, file_path, ocr_content)) self.connection.commit() print(f"文件 {file_name} 数据入库成功") except Exception as e: self.connection.rollback() print(f"数据库插入失败: {e}") def close(self): self.connection.close() ```

五、全流程自动化脚本编写

我们将上述模块整合,编写一个主程序 main.py,用于批量扫描指定文件夹下的图片,执行“预处理-识别-入库”全流程。

1. 主程序逻辑

该脚本会遍历 ./archives 文件夹下的所有 .jpg.png 文件。请确保在项目根目录下创建 archives 文件夹并放入待处理的档案图片。

```python import os import time from img_processor import preprocess_image, binary_image from ocr_engine import extract_text_from_image from db_manager import DBManager 配置图片存储目录 SOURCE_DIR = './archives' def main(): db = DBManager() if not os.path.exists(SOURCE_DIR): print(f"源目录 {SOURCE_DIR} 不存在,请创建并放入图片。") return files = [f for f in os.listdir(SOURCE_DIR) if f.lower().endswith(('.jpg', '.png', '.jpeg'))] total_files = len(files) print(f"开始处理,共发现 {total_files} 个档案文件...") for index, filename in enumerate(files): file_path = os.path.join(SOURCE_DIR, filename) print(f"[{index+1}/{total_files}] 正在处理: {filename}") try: 1. 图像预处理 gray_img = preprocess_image(file_path) binary_img = binary_image(gray_img) 2. OCR识别 这里为了演示,直接识别二值化后的图像 实际生产中可保存binary_img到临时文件再读取,或者直接传numpy数组 text_content = extract_text_from_image(binary) if not text_content: print(f"警告: {filename} 未识别到文字内容,跳过入库。") continue 3. 入库 db.insert_record(filename, file_path, text_content) except Exception as e: print(f"处理文件 {filename} 时发生错误: {e}") continue db.close() print("所有任务处理完毕。") if __name__ == "__main__": main() ```

六、运行与部署注意事项

代码编写完成后,直接运行 main.py 即可。但在实际落地宿州档案数字化项目时,需注意以下性能与准确率优化细节。

  • 修正main.py中的变量引用:在第五部分的代码中,extract_text_from_image(binary) 应修正为 extract_text_from_image(binary_img),确保变量名一致。
  • 识别率优化:如果发现识别率低,检查扫描件DPI是否不低于300。对于表格类档案,建议调整OCR配置参数 --psm 为3或4,或使用Table-Structuring专用模型。
  • 并发处理:当前脚本为单线程串行处理。若需处理海量档案(如10万份以上),建议使用 concurrent.futures.ThreadPoolExecutor 改造 main.py,开启多线程并行识别,但需注意数据库连接池的配置,避免连接数溢出。
  • 路径问题:Windows下路径包含反斜杠,入库时建议使用 os.path.abspath 获取绝对路径,避免后续读取路径错误。
AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

扫码咨询
安答联动微信公众号二维码

微信扫码关注安答联动

申请试用
热线电话
申请试用

安答联动档案管理系统