医院档案数字化实战:OCR识别与数据库管理搭建教程
一、环境准备与依赖安装
在开始医院档案数字化系统的搭建之前,必须先配置好基础的运行环境。本方案基于Linux服务器(推荐Ubuntu 20.04 LTS)和Python 3.8开发,能够实现高并发的档案识别与存储。
1. 安装Tesseract OCR引擎
Tesseract是目前开源界最精准的OCR引擎,支持中文识别。执行以下命令进行安装:
Linux安装命令:
sudo apt update
sudo apt install tesseract-ocr
sudo apt install tesseract-ocr-chi-sim 安装中文语言包
<>Windows环境下载:
访问 https://github.com/UB-Mannheim/tesseract/wiki 下载Windows安装包。安装时务必勾选“Chinese (Simplified)”语言包,并记住安装路径(默认为C:\Program Files\Tesseract-OCR)。
2. 配置Python虚拟环境与依赖库
使用Python进行胶水代码的编写,连接OCR引擎与数据库。执行以下步骤:
创建项目目录
mkdir hospital_archive_system
cd hospital_archive_system
创建虚拟环境
python3 -m venv venv
source venv/bin/activate Windows下使用 venv\Scripts\activate
安装核心依赖库
pip install pytesseract opencv-python pillow mysql-connector-python flask
依赖库说明:
- pytesseract:Python的Tesseract封装包。
- opencv-python:用于图像预处理(去噪、二值化),提升识别率。
- mysql-connector-python:用于连接MySQL数据库存储档案元数据。
- flask:用于构建简易的Web管理界面。
二、数据库架构设计与初始化
档案管理的核心在于结构化存储。我们需要一个数据库来存储档案的基本信息(如患者ID、档案类型)以及识别后的全文文本,以便后续检索。
1. 创建数据库与数据表
首先登录MySQL服务器,执行以下SQL脚本。请确保你已经安装并启动了MySQL服务。
CREATE DATABASE hospital_archive_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE hospital_archive_db;
CREATE TABLE archives (
id INT AUTO_INCREMENT PRIMARY KEY,
file_name VARCHAR(255) NOT NULL COMMENT '原始文件名',
file_path VARCHAR(500) NOT NULL COMMENT '文件存储路径',
department VARCHAR(100) COMMENT '所属科室',
patient_id VARCHAR(50) COMMENT '患者ID',
ocr_text TEXT COMMENT 'OCR识别后的全文内容',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '入库时间',
INDEX idx_patient_id (patient_id),
FULLTEXT INDEX idx_ocr_text (ocr_text) COMMENT '全文检索索引'
);
注意:这里建立了patient_id的普通索引和ocr_text的全文索引,这是为了在后续管理中能快速通过患者ID或病历内容查找到对应档案。
三、图像预处理与OCR识别核心代码
医院档案通常为扫描件,可能包含噪点或倾斜。直接识别准确率较低,必须进行预处理。我们将代码封装在ocr_core.py中。
1. 图像预处理函数
使用OpenCV将图像转为灰度图,并进行自适应二值化处理,去除纸张底色干扰。
import cv2
import numpy as np
def preprocess_image(image_path):
读取图像
img = cv2.imread(image_path)
if img is None:
return None
转灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
自适应阈值二值化(处理光照不均)
这里的11和2是经验参数,适用于大多数文字扫描件
binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
降噪(中值滤波)
denoised = cv2.medianBlur(binary, 3)
return denoised
2. OCR识别封装
调用Tesseract进行识别,并指定中文语言库。

import pytesseract
from PIL import Image
如果是Windows环境,需要取消下面这行的注释并指定路径
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
def perform_ocr(image_path):
try:
1. 预处理图像
processed_img = preprocess_image(image_path)
if processed_img is None:
return "Error: 无法读取图像文件"
2. 将OpenCV图像转为PIL格式
pil_img = Image.fromarray(processed_img)
3. 配置识别参数:lang='chi_sim'简体中文,--psm 6假设为单行文本块
custom_config = r'--oem 3 --psm 6'
text = pytesseract.image_to_string(pil_img, lang='chi_sim', config=custom_config)
return text.strip()
except Exception as e:
return f"Error: {str(e)}"
四、业务逻辑实现:扫描文件自动入库
本环节编写主程序main.py,模拟医院档案数字化流程:扫描文件 -> OCR识别 -> 存入数据库。假设扫描好的PDF或图片存放在./scans目录下。
1. 数据库连接配置
import mysql.connector
import os
import glob
from ocr_core import perform_ocr 引入上面写的模块
数据库配置
db_config = {
'user': 'root',
'password': 'your_password', 请修改为实际密码
'host': 'localhost',
'database': 'hospital_archive_db'
}
def get_db_connection():
return mysql.connector.connect(db_config)
2. 文件处理与入库逻辑
def process_files():
支持的图片格式
extensions = ['.jpg', '.jpeg', '.png', '.tif']
files_grabbed = []
for ext in extensions:
files_grabbed.extend(glob.glob(os.path.join('./scans', ext)))
conn = get_db_connection()
cursor = conn.cursor()
insert_query = """
INSERT INTO archives (file_name, file_path, department, patient_id, ocr_text)
VALUES (%s, %s, %s, %s, %s)
"""
print(f"开始处理,共发现 {len(files_grabbed)} 个文件...")
for file_path in files_grabbed:
file_name = os.path.basename(file_path)
模拟解析文件名获取信息,假设文件名格式为:科室_患者ID_时间.jpg
例如:内科_10023_20231001.jpg
try:
parts = file_name.split('_')
dept = parts[0]
pid = parts[1].split('.')[0] 去除后缀
except:
dept = "未知科室"
pid = "未知ID"
print(f"正在识别: {file_name} ...")
ocr_result = perform_ocr(file_path)
数据入库
data = (file_name, file_path, dept, pid, ocr_result)
cursor.execute(insert_query, data)
conn.commit()
print(f"入库成功: {file_name}")
cursor.close()
conn.close()
print("所有文件处理完毕。")
if __name__ == "__main__":
确保scans目录存在
if not os.path.exists('./scans'):
os.makedirs('./scans')
print("请将扫描好的图片放入 ./scans 目录下")
else:
process_files()
五、搭建简易Web查询界面
为了让医护人员能够直接使用浏览器查询档案,我们使用Flask快速搭建一个Web服务。
创建文件app.py:
from flask import Flask, render_template, request
import mysql.connector
app = Flask(__name__)
def get_db_connection():
return mysql.connector.connect(user='root', password='your_password', host='localhost', database='hospital_archive_db')
@app.route('/')
def index():
return render_template('index.html')
@app.route('/search')
def search():
query = request.args.get('q', '')
conn = get_db_connection()
cursor = conn.cursor(dictionary=True)
使用全文检索匹配OCR内容,或者精确匹配患者ID
sql = """
SELECT FROM archives
WHERE patient_id LIKE %s OR MATCH(ocr_text) AGAINST(%s IN NATURAL LANGUAGE MODE)
LIMIT 20
"""
like_query = f"%{query}%"
cursor.execute(sql, (like_query, query))
results = cursor.fetchall()
cursor.close()
conn.close()
return render_template('results.html', results=results, query=query)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
1. 创建前端模板
在项目目录下创建templates文件夹,并新建index.html和results.html。
templates/index.html:
医院档案查询
档案数字化管理系统
templates/results.html:
搜索结果
返回首页
关键词: {{ query }} 的搜索结果
{% for item in results %}
-
文件名: {{ item.file_name }}
患者ID: {{ item.patient_id }}
科室: {{ item.department }}
识别摘要: {{ item.ocr_text[:200] }}...
{% endfor %}
六、系统启动与测试
所有代码已准备就绪,现在进行整体测试。
1. 准备测试数据
找一张包含文字的病历图片,将其重命名为内科_10086_test.jpg,并放入项目的./scans目录中。
2. 执行入库脚本
在终端运行:
python main.py
观察终端输出,确认“入库成功”且无报错。此时,图片的文字内容已被提取并存入MySQL的archives表中。
3. 启动Web服务
在终端运行:
python app.py
看到输出Running on http://0.0.0.0:5000即表示启动成功。
4. 验证功能
打开浏览器,访问http://localhost:5000。在搜索框中输入“10086”或图片中包含的某个病历关键词。如果能看到文件名和识别摘要,说明整个数字化流程已打通。