中医医院档案数字化整理全流程实操技术指南
一、开发环境搭建与依赖安装
在进行中医医院档案整理之前,必须先构建一个稳定且支持中文OCR识别的Python环境。中医档案往往包含大量手写处方、古籍扫描件以及复杂的病理描述,因此我们需要配置高精度的识别引擎。
1. Python 环境配置
建议直接安装 Python 3.9 或 3.10 版本以确保库的兼容性。打开终端(Windows下使用PowerShell或CMD),执行以下命令升级 pip 并安装核心依赖库:
python -m pip install --upgrade pip
pip install opencv-python pillow pytesseract pandas openpyxl
上述库的作用如下:opencv-python用于图像预处理(去噪、二值化);pillow用于图像格式转换;pytesseract是OCR识别的Python接口;pandas和openpyxl用于将识别结果导出为Excel表格。
2. Tesseract OCR 引擎安装
Python库只是接口,真正的识别核心是 Tesseract 引擎。必须下载并安装 Windows 版本的安装包。
下载地址:https://github.com/UB-Mannheim/tesseract/wiki
请下载 tesseract-ocr-w64-setup-5.3.3.exe(或更新版本)。安装时,务必勾选 "Chinese (Simplified)" 和 "Chinese (Traditional)" 语言数据包,这对于识别中医处方中的繁简字混用情况至关重要。
安装完成后,需要配置系统环境变量。将 Tesseract 的安装路径(默认为 C:\Program Files\Tesseract-OCR)添加到系统的 Path 变量中。如果不配置环境变量,后续脚本运行时会报错。
二、图像预处理:提升档案识别率
中医医院的档案多为纸质扫描件,往往存在底色发黄、字迹潦草、有印章干扰等问题。直接进行OCR识别效果极差,必须通过代码进行预处理。我们将编写一个预处理函数,实现灰度化、去噪和二值化。
新建一个文件 preprocess.py,输入以下代码:
import cv2
import numpy as np
def preprocess_image(image_path):
读取图像
img = cv2.imread(image_path)
if img is None:
print(f"错误:无法读取图像 {image_path}")
return None
1. 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
2. 双边滤波去噪,保留边缘信息(对于手写线条很重要)
d=9, sigmaColor=75, sigmaSpace=75
filtered = cv2.bilateralFilter(gray, 9, 75, 75)
3. 自适应阈值二值化
这一步能把发黄的背景变成纯白,字迹变成纯黑
blockSize=11, C=2 是针对文字识别调优的参数
binary = cv2.adaptiveThreshold(
filtered, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2
)
4. 降噪(去除椒盐噪声)
denoised = cv2.medianBlur(binary, 3)
return denoised
这段代码使用了双边滤波而非高斯模糊,目的是在平滑图像背景的同时,尽可能保留处方笔画的锐利边缘。自适应阈值处理能有效解决光照不均导致的档案部分区域过暗或过亮问题。
三、OCR 文字识别与结构化提取

图像处理好后,接下来是核心的文字识别与信息提取。我们需要识别出患者姓名、性别、年龄、诊断结果以及具体的处方药材。这需要利用 Tesseract 的中文语言库,并结合正则表达式进行清洗。
1. 配置 Tesseract 路径
在脚本中显式指定 Tesseract 的可执行文件路径,防止因环境变量未生效而导致的运行失败。
2. 编写识别与提取脚本
继续编写核心逻辑,创建 ocr_engine.py:
import pytesseract
import re
import pandas as pd
import os
from preprocess import preprocess_image
请根据实际安装路径修改,Windows下通常需要指定 .exe
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
def extract_tcm_info(text):
"""
使用正则表达式从OCR识别的文本中提取结构化信息
"""
info = {}
提取姓名(假设格式为:姓名:张三 或 姓名:张三)
name_match = re.search(r'姓名[::]\s([\u4e00-\u9fa5]{2,4})', text)
info['姓名'] = name_match.group(1) if name_match else "未识别"
提取年龄
age_match = re.search(r'年龄[::]\s(\d{1,3})', text)
info['年龄'] = age_match.group(1) if age_match else "未识别"
提取诊断/证型(中医特有,如:肝阳上亢)
匹配“诊断”或“证型”后的中文内容,直到遇到换行或“处方”
diag_match = re.search(r'(诊断|证型)[::]\s([\u4e00-\u9fa5、\d]+)', text)
info['诊断'] = diag_match.group(2) if diag_match else "未识别"
提取处方内容(通常在“处方”或“医嘱”之后)
这里简化处理,提取包含常见中药材关键词的行
prescription_match = re.search(r'(处方|医嘱)[::]\s(.)', text, re.DOTALL)
raw_prescription = prescription_match.group(2) if prescription_match else ""
清洗处方中的空格和特殊字符
info['处方内容'] = re.sub(r'\s+', '', raw_prescription)
return info
def process_folder(folder_path, output_excel):
results = []
遍历文件夹中的所有图片
for filename in os.listdir(folder_path):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
full_path = os.path.join(folder_path, filename)
print(f"正在处理: {filename}...")
1. 预处理
processed_img = preprocess_image(full_path)
if processed_img is None:
continue
2. OCR识别
--psm 6 假设图像是统一的文本块
-l chi_sim+chi_tra 指定简体和繁体中文
config = r'--psm 6 -l chi_sim+chi_tra'
text = pytesseract.image_to_string(processed_img, config=config)
3. 提取信息
data = extract_tcm_info(text)
data['原始文件名'] = filename
data['识别全文'] = text 保留全文用于人工核对
results.append(data)
4. 保存到Excel
df = pd.DataFrame(results)
df.to_excel(output_excel, index=False, engine='openpyxl')
print(f"处理完成!结果已保存至: {output_excel}")
在上述代码中,config = r'--psm 6 -l chi_sim+chi_tra' 是关键参数。psm 6 表示将图像视为一行统一的文本块,适合处理整张处方扫描;chi_sim+chi_tra 同时加载简体和繁体字库,因为中医古籍或老中医手写常涉及繁体字。
四、完整自动化归档脚本实现
为了方便一键运行,我们需要一个主入口文件 main.py,将所有逻辑串联起来。请确保你的目录结构如下:档案文件夹放在 ./archives 下,输出结果为 result.xlsx。
import os
import shutil
from ocr_engine import process_folder
def main():
定义输入输出路径
input_folder = './archives' 存放待整理的档案图片
output_file = './中医档案整理结果.xlsx'
processed_folder = './processed_archives' 已处理文件归档处
检查输入目录是否存在
if not os.path.exists(input_folder):
print(f"错误:找不到输入目录 {input_folder},请手动创建该目录并放入图片。")
return
创建已处理目录
if not os.path.exists(processed_folder):
os.makedirs(processed_folder)
执行批量处理
try:
process_folder(input_folder, output_file)
可选:处理完成后移动文件到已处理目录,避免重复处理
print("正在移动已处理文件...")
for filename in os.listdir(input_folder):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
src = os.path.join(input_folder, filename)
dst = os.path.join(processed_folder, filename)
shutil.move(src, dst)
print("所有文件已归档至 ./processed_archives 目录。")
except Exception as e:
print(f"处理过程中发生错误: {e}")
if __name__ == "__main__":
main()
五、运行脚本与数据验证
1. 准备测试数据
在项目根目录下新建一个名为 archives 的文件夹。将几张中医处方、病历首页的扫描图片(JPG或PNG格式)复制进去。确保图片清晰度适中,DPI至少在 200 以上。
2. 执行命令
在终端中运行主程序:
python main.py
3. 结果校验与修正
程序运行结束后,会生成 中医档案整理结果.xlsx。打开该文件,你将看到以下列:
- 姓名:提取的患者姓名。
- 年龄:提取的数字。
- 诊断:中医证型或诊断结果。
- 处方内容:去除空格后的药材列表。
- 识别全文:OCR原始识别结果,用于核对“处方内容”列是否有遗漏。
如果发现识别率不高,请检查 preprocess.py 中的二值化参数,或者检查 Tesseract 是否正确安装了中文语言包。对于手写极其潦草的处方,目前的纯开源方案可能无法达到100%准确,建议人工复核“识别全文”列,修正后再次归档。
通过以上步骤,你已经建立了一套完全自动化的中医医院档案整理流水线,无需人工录入即可将纸质图片转化为可编辑、可检索的 Excel 数据,极大地提升了档案管理效率。