一、环境准备与依赖安装
在进行疾控中心档案数字化处理时,我们需要构建一个基于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_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/。