医院档案数字化实战: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进行识别,并指定中文语言库。

医院档案数字化实战:OCR识别与数据库管理搭建教程

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.htmlresults.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”或图片中包含的某个病历关键词。如果能看到文件名和识别摘要,说明整个数字化流程已打通。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统