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

零基础Python自动化医疗档案OCR识别与归档实操

发布时间:2026年08月21日 15:20:06 浏览量:0

一、技术方案与工具选型

医疗档案整理的核心痛点在于将非结构化的扫描件(图片或PDF)转化为可搜索、可分类的结构化数据。本指南采用Python语言,结合开源的Tesseract-OCR引擎进行文字识别,利用正则表达式提取关键信息(如患者姓名、病历号),最后通过文件系统操作实现自动重命名与归档。此方案无需购买昂贵的商业软件,完全本地化运行,确保患者隐私数据不外泄,且具备极高的可扩展性。

二、环境准备与依赖安装

在编写代码之前,必须搭建好基础运行环境。请严格按照以下步骤操作,任何一步缺失都会导致后续程序报错。

1. 安装Tesseract-OCR引擎

Tesseract是OCR技术的核心引擎。Windows用户请前往UB Mannheim镜像站下载Windows安装包。下载地址:https://github.com/UB-Mannheim/tesseract/wiki。请下载最新的稳定版(如tesseract-ocr-w64-setup-5.x.x.exe)。

安装过程中,务必在“Choose Components”界面勾选“Chinese (Simplified)”语言包,否则程序无法识别中文汉字。默认安装路径通常为C:\Program Files\Tesseract-OCR\tesseract.exe,请牢记此路径,后续代码配置需要用到。

2. 安装Python依赖库

打开命令行工具(CMD或PowerShell),执行本方案所需的第三方库安装命令。pytesseract是Python的OCR封装库,Pillow用于图像预处理,pdf2image用于处理PDF格式的病历档案。

零基础Python自动化医疗档案OCR识别与归档实操

pip install pytesseract Pillow pdf2image

3. 配置PDF处理环境(可选)

如果你的医疗档案是PDF格式,必须安装Poppler工具。pdf2image依赖Poppler将PDF渲染为图片。Windows用户下载地址:https://github.com/oschwartz10612/poppler-windows/releases/。下载最新版Release,解压后将bin文件夹的完整路径(如C:\poppler-xx\bin)添加到Windows系统的“环境变量”中的Path里,否则无法调用转换功能。

三、核心代码实现

新建一个名为medical_sort.py的文件。我们将代码分为四个模块:配置初始化、图像预处理、信息提取、主控逻辑。这种结构清晰明了,便于后续维护。

1. 初始化配置与图像预处理

直接识别彩色扫描件往往准确率较低,我们需要先将图像转换为灰度图并增强对比度,去除背景噪点,从而显著提升OCR识别率。

import pytesseract
from PIL import Image, ImageEnhance
import os
import re
import shutil
from pdf2image import convert_from_path
⚠️ 请将此处路径修改为你电脑上Tesseract的实际安装路径
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
def preprocess_image(img_obj):
"""图像预处理:转灰度、增强对比度,提高OCR准确率"""
try:
转换为灰度图,减少色彩干扰
img = img_obj.convert('L')
增强对比度,使文字更清晰
enhancer = ImageEnhance.Contr(img)
img = enhancer.enhance(2.0)
二值化处理(可选,针对噪点大的图片)
img = img.point(lambda x: 0 if x < 128 else 255, '1')
return img
except Exception as e:
print(f"图像预处理失败: {e}")
return None

2. 提取关键信息逻辑

OCR识别出的原始文本通常包含乱码或多余的空格。我们需要编写健壮的正则表达式来精准匹配“姓名”和“就诊日期”。假设档案中存在“姓名:张三”和“日期:2023-10-01”格式的文本。

def extract_info(text):
"""使用正则从OCR文本中提取姓名和日期"""
匹配“姓名”或“Name”后跟冒号和中文/英文内容
正则解释:(姓名|Name)匹配关键字,[::]匹配中英文冒号,\s匹配空格,([^\s\n]+)捕获非空字符
name_pattern = re.search(r'(姓名|Name)[::]\s([^\s\n]+)', text)
匹配日期格式 YYYY-MM-DD
date_pattern = re.search(r'(\d{4}-\d{2}-\d{2})', text)
patient_name = name_pattern.group(2).strip() if name_pattern else "未知患者"
visit_date = date_pattern.group(1) if date_pattern else "未知日期"
数据清洗:去除姓名中可能残留的标点符号
patient_name = patient_name.replace(":", "").replace(":", "").replace(" ", "")
return patient_name, visit_date

3. 文件处理与归档主程序

此部分负责遍历源文件夹,判断文件类型(图片或PDF),调用上述函数执行识别,并根据提取的信息重命名文件,移动到目标文件夹。为了防止文件名冲突,逻辑中包含了重名自动追加序号的功能。

def sort_medical_files(source_dir, target_dir):
if not os.path.exists(target_dir):
os.makedirs(target_dir)
支持的图片格式
valid_extensions = ('.jpg', '.jpeg', '.png', '.bmp', '.pdf')
for filename in os.listdir(source_dir):
if filename.lower().endswith(valid_extensions):
file_path = os.path.join(source_dir, filename)
print(f"正在处理: {filename} ...")
img_obj = None
判断文件类型并加载
if filename.lower().endswith('.pdf'):
try:
将PDF的第一页转换为图片,提高处理速度
pages = convert_from_path(file_path, first_page=1, last_page=1)
if pages:
img_obj = pages[0]
except Exception as e:
print(f"PDF转换失败,请检查Poppler配置: {e}")
continue
else:
try:
img_obj = Image.open(file_path)
except Exception as e:
print(f"图片打开失败: {e}")
continue
1. 预处理
processed_img = preprocess_image(img_obj)
if not processed_img:
continue
2. OCR识别 (指定简体中文 lang='chi_sim')
config='--psm 6' 假设图片是单行文本块,适合识别表头信息
custom_config = r'--psm 6'
try:
ocr_text = pytesseract.image_to_string(processed_img, lang='chi_sim', config=custom_config)
except Exception as e:
print(f"OCR识别出错: {e}")
continue
3. 提取信息
name, date = extract_info(ocr_text)
4. 构建新文件名并移动
if name != "未知患者":
获取文件扩展名
ext = os.path.splitext(filename)[1]
new_filename = f"{name}_{date}{ext}"
target_path = os.path.join(target_dir, new_filename)
处理文件名冲突
counter = 1
while os.path.exists(target_path):
new_filename = f"{name}_{date}_{counter}{ext}"
target_path = os.path.join(target_dir, new_filename)
counter += 1
shutil.move(file_path, target_path)
print(f"✅ 归档成功: {new_filename}")
else:
print(f"⚠️ 无法识别姓名,跳过文件: {filename} (原始文本: {ocr_text[:20]})")
if __name__ == "__main__":
⚠️ 请在此处修改为你的实际文件夹路径,建议使用绝对路径
source_folder = r'C:\Users\Public\Desktop\待整理医疗档案'
target_folder = r'C:\Users\Public\Desktop\已归档医疗档案'
sort_medical_files(source_folder, target_folder)

四、运行验证与常见错误排查

代码编写完成后,在命令行执行python medical_sort.py即可开始批量整理。程序会逐个打印处理进度。如果遇到报错,请对照以下方案进行排查:

微信咨询
电话联系
QQ客服
微信咨询一对一服务
服务热线: 028-8744 4417
QQ客服: 2305721818