疾控中心档案数字化实操指南:OCR识别与数据归档实战

一、环境准备与依赖安装

在进行疾控中心档案数字化处理时,我们需要构建一个基于Python的自动化处理环境。该环境需要具备图像预处理、OCR文字识别以及数据存储的能力。以下是具体的安装步骤和命令。

1. 安装 Tesseract-OCR 引擎

Tesseract是OCR识别的核心引擎,必须优先安装。请勿使用系统默认源,版本过低会导致中文识别率极低。

Windows系统安装:

直接下载安装包,地址为:https://github.com/UB-Mannheim/tesseract/wiki

下载 tesseract-ocr-w64-setup-5.3.3.exe(或更新版本)。安装时务必勾选 Chinese (Simplified) 语言包,否则无法识别中文。假设安装路径为 C:\Program Files\Tesseract-OCR,请将该路径添加到系统环境变量 Path 中。

Linux系统安装:

```bash sudo apt update sudo apt install tesseract-ocr tesseract-ocr-chi-sim ```

2. 安装 Python 依赖库

在项目目录下,创建 requirements.txt 并写入以下内容,确保版本一致性,避免兼容性问题:

```text pytesseract==0.3.10 Pillow==10.0.0 opencv-python==4.8.0.76 pymysql==1.1.0 numpy==1.24.3 ```

执行安装命令:

```bash pip install -r requirements.txt ```

二、图像预处理:提升识别率的关键

疾控中心的纸质档案往往年代久远,存在噪点、倾斜或字迹模糊的情况。直接进行OCR识别准确率通常不足60%,必须进行预处理。我们将使用OpenCV进行灰度化、二值化和去噪处理。

创建文件 image_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}") 1. 灰度化处理 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 2. 二值化处理 (OTSU自动寻找阈值) 这一步对于黑白分明的文档效果显著 _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) 3. 去噪处理 使用中值滤波去除盐椒噪点,ksize设为3 denoised = cv2.medianBlur(binary, 3) return denoised ```

三、OCR核心识别逻辑实现

本节将调用Tesseract引擎提取文本。针对疾控档案表格密集的特点,我们需要配置特定的识别参数。

疾控中心档案数字化实操指南:OCR识别与数据归档实战

创建文件 ocr_engine.py

```python import pytesseract from PIL import Image import os 如果是Windows系统,必须显式指定tesseract.exe路径 如果是Linux,通常不需要指定,但建议保留以备不时之需 windows_path = r'C:\Program Files\Tesseract-OCR\tesseract.exe' pytesseract.pytesseract.tesseract_cmd = windows_path def extract_text_from_image(image_matrix): """ 从处理后的OpenCV图像矩阵中提取文字 """ 将OpenCV矩阵转换为PIL Image对象 pil_img = Image.fromarray(image_matrix) 配置OCR参数 --psm 6: 假设图像为统一的文本块 -l chi_sim+eng: 同时使用中文简体和英文字库 custom_config = r'--psm 6 --oem 3 -l chi_sim+eng' try: text = pytesseract.image_to_string(pil_img, config=custom_config) return text except Exception as e: print(f"OCR识别失败: {e}") return "" ```

四、结构化数据提取

OCR提取的是纯文本,而疾控系统需要结构化数据(如姓名、身份证号、疾病名称)。我们需要使用正则表达式从杂乱的文本中清洗出关键信息。

创建文件 data_parser.py

```python import re def parse_cdc_record(raw_text): """ 根据疾控档案常见格式解析数据 """ data = { "name": "未知", "id_card": "未知", "disease_code": "未知", "report_date": "未知" } 1. 提取姓名 (假设格式为 "姓名:张三" 或 "姓名:张三") name_pattern = re.compile(r'姓名[::]\s([\u4e00-\u9fa5]{2,4})') name_match = name_pattern.search(raw_text) if name_match: data["name"] = name_match.group(1) 2. 提取身份证号 (18位数字) id_pattern = re.compile(r'(\d{17}[\dXx])') id_match = id_pattern.search(raw_text) if id_match: data["id_card"] = id_match.group(1) 3. 提取疾病编码 (假设为字母+数字组合,如 A01.01) disease_pattern = re.compile(r'([A-Z]\d{2}\.?\d)') disease_match = disease_pattern.search(raw_text) if disease_match: data["disease_code"] = disease_match.group(1) 4. 提取报告日期 (YYYY-MM-DD) date_pattern = re.compile(r'(\d{4}-\d{2}-\d{2})') date_match = date_pattern.search(raw_text) if date_match: data["report_date"] = date_match.group(1) return data ```

五、数据库存储落地

提取后的数据需要持久化存储。这里以MySQL为例,展示如何建表并插入数据。

1. 初始化数据库表

请在MySQL中执行以下SQL语句,确保表结构正确:

```sql CREATE DATABASE IF NOT EXISTS cdc_archive_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE cdc_archive_db; CREATE TABLE IF NOT EXISTS patient_records ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL COMMENT '患者姓名', id_card VARCHAR(18) NOT NULL UNIQUE COMMENT '身份证号', disease_code VARCHAR(20) COMMENT '疾病编码', report_date DATE COMMENT '报告日期', raw_text TEXT COMMENT 'OCR原始文本', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ```

2. 数据库操作代码

创建文件 db_manager.py

```python import pymysql class DBManager: def __init__(self, host, user, password, database): self.conn = pymysql.connect( host=host, user=user, password=password, database=database, charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor ) def insert_record(self, data_dict, raw_text): try: with self.conn.cursor() as cursor: sql = """ INSERT INTO patient_records (name, id_card, disease_code, report_date, raw_text) VALUES (%s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE disease_code=VALUES(disease_code), report_date=VALUES(report_date) """ cursor.execute(sql, ( data_dict['name'], data_dict['id_card'], data_dict['disease_code'], data_dict['report_date'], raw_text ) ) self.conn.commit() print(f"成功录入: {data_dict['name']}") except Exception as e: self.conn.rollback() print(f"数据库写入失败: {e}") def close(self): self.conn.close() ```

六、全流程自动化脚本整合

我们将上述模块串联起来,形成一个可执行的自动化脚本。请将以下代码保存为 run_pipeline.py

确保你的目录下有一个名为 test_image.jpg 的测试图片,并修改数据库连接信息。

```python import os import sys from image_processor import preprocess_image from ocr_engine import extract_text_from_image from data_parser import parse_cdc_record from db_manager import DBManager 配置区域 DB_CONFIG = { "host": "localhost", "user": "root", "password": "your_password", 请修改为实际密码 "database": "cdc_archive_db" } def process_single_file(file_path): print(f"正在处理文件: {file_path}") 1. 图像预处理 try: processed_img = preprocess_image(file_path) except Exception as e: print(f"预处理错误: {e}") return 2. OCR识别 raw_text = extract_text_from_image(processed_img) if not raw_text.strip(): print("OCR未识别到文字,跳过。") return print(f"识别文本预览: {raw_text[:50]}...") 3. 数据解析 parsed_data = parse_cdc_record(raw_text) print(f"解析数据: {parsed_data}") 4. 存储入库 db = DBManager(DB_CONFIG) db.insert_record(parsed_data, raw_text) db.close() def main(): 这里可以是单个文件,也可以是遍历文件夹 示例:处理当前目录下的 test_image.jpg target_file = "test_image.jpg" if os.path.exists(target_file): process_single_file(target_file) else: print(f"文件不存在: {target_file}") if __name__ == "__main__": main() ```

七、常见报错与解决方案

在实操过程中,可能会遇到以下具体问题,请按方案排查:

  • 报错: tesseract is not installed or it's not in your PATH

    解决: Windows用户必须在代码中调用 pytesseract.pytesseract.tesseract_cmd = r'你的安装路径\tesseract.exe'。Linux用户需检查软链接 which tesseract 是否存在。

  • 报错: data_dict['name'] KeyError

    解决: 这意味着正则表达式未匹配到内容。请打印 raw_text 查看OCR识别出的原始内容,调整 data_parser.py 中的正则表达式,特别是中英文标点符号的差异。

  • 现象: 识别结果全是乱码。

    解决: 通常是未加载中文语言包。请重新运行Tesseract安装程序,确保勾选 Chinese (Simplified)。在Linux上,确保下载了 chi_sim.traineddata 放入 /usr/share/tesseract-ocr/4.00/tessdata/

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统