【项目总结】快瞳医疗化验单的OCR识别

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
Elasticsearch Serverless检索通用型,资源抵扣包 100CU*H
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 快瞳科技通过图像识别技术,成功解决了医疗化验单OCR识别难题。项目要求精准识别表格内容,尤其是化验数值和名称,准确率达85%以上。针对化验单来源多样、干扰因素多的问题,团队采用智能文档抽取模型、opencv技术(如霍夫变换)进行图片扶正与裁剪,优化识别精度。最终,项目不仅达到药企要求,还实现超越,为医疗行业智能化转型提供了高性价比解决方案,助力快瞳科技在医疗信息化领域树立良好口碑。

前言

在医疗信息化进程不断推进的当下,医疗化验单的数字化处理成为提升医疗效率的关键环节。快瞳科技凭借在图像识别领域的深厚技术积累,成功攻克了医疗化验单 OCR 识别难题,为医疗行业的智能化转型提供了有力支持。

image.png

一、项目要求

快瞳科技与广州知名药企携手,旨在精准识别医疗化验单表格内容,尤其是化验数值和名称的准确率,要求达到85%以上。化验单上的三线表内容为本次项目的核心识别对象,而像姓名、年龄等表格外信息则不在本次识别范围内。
由于化验单来源多样,包括PDF版、手动拍照版以及拍摄电脑屏幕版,存在竖线、手写体等多种干扰因素,给识别工作带来了极大挑战。药企此前使用的识别模型准确率难以提升,因此将目光投向了快瞳科技,期望借助我们的技术实力解决这一难题。

二、解决思路

模型选择
本方案采用快瞳智能文档抽取模型作为基础。该模型在文字识别方面具有较高的准确率和良好的通用性,为项目的顺利开展奠定了坚实基础。
图像扶正
面对化验单图片存在倾斜角度、曲折等问题,快瞳科技深知必须先将图片扶正,使其处于水平状态,以提高OCR识别准确率。同时,扶正后的图片便于后续裁剪操作,进一步提升识别精度。

image.png

考虑到药企希望将此技术应用于小程序,对模型大小有一定限制,快瞳科技决定采用opencv技术来实现图片扶正。通过分析三线表的直线特征,计算其斜率并取平均值作为判断图片是否水平的依据。
在尝试多种opencv识别直线算法后,霍夫变换因其经典实用且经过调参优化后效果良好,成为最终选择。尽管样本干扰较多,霍夫变换仍能相对准确地识别出直线,为图片扶正提供了可靠依据。
图像裁剪
在解决图片倾斜问题后,快瞳科技发现仅将需要识别的表格裁剪出来,可显著提高识别精度。对于三线表,找出第一根和最后一根直线,即可实现表格的精准裁剪。

image.png

此外,针对双栏表(中间有一条竖线,分为两栏内容),快瞳科技采取将其裁剪成两部分的策略,进一步优化了识别效果,确保各类表格的识别精度都能得到充分保障。

image.png

完整流程
构建了一套完整的流程:将一张化验单图片输入后,先进行预处理,包括图片扶正和裁剪等操作,然后将预处理后的图片送入 PaddleOCR 模型进行识别,最后通过文字纠正(模型后处理)环节,输出高质量的识别结果。

import cv2
import numpy as np
import math
import os

class RectifyBias():

def __init__(self,pic_path):
    self.pic_path=pic_path    #图片路径

def rotate_bound(self,image, angle):
    (h, w) = image.shape[:2]
    (cX, cY) = (w / 2, h / 2)
    M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)
    cos = np.abs(M[0, 0])
    sin = np.abs(M[0, 1])
    nW = int((h * sin) + (w * cos))
    nH = int((h * cos) + (w * sin))
    M[0, 2] += (nW / 2) - cX
    M[1, 2] += (nH / 2) - cY
    return cv2.warpAffine(image, M, (nW, nH))
# 轮廓方法
def find_contour(self):
    pic=cv2.imdecode(np.fromfile(self.pic_path,dtype=np.uint8),cv2.IMREAD_COLOR)
    gray=cv2.cvtColor(pic,cv2.COLOR_BGR2GRAY)
    thresh, binary=cv2.threshold(gray,150,255,cv2.THRESH_BINARY)
    img=pic.copy()
    a,b=cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    row,col=binary.shape
    for i in range(len(a)):
        if cv2.arcLength(a[i],closed=True)>col/2  and cv2.arcLength(a[i],closed=True)<1.9*(col+row):
            cv2.drawContours(img,a,i,(0,0,255),2)
            coor=a[i]
            break
    if cv2.minAreaRect(coor)[2]<45:
        imgs=self.rotate_bound(img,-(cv2.minAreaRect(coor)[2]))
    else:
        imgs=self.rotate_bound(img,90-(cv2.minAreaRect(coor)[2]))
    cv2.namedWindow("before",cv2.WINDOW_NORMAL)
    cv2.resizeWindow("before",1200,1200)
    cv2.imshow("before",img)
    cv2.imshow("after",imgs)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
 # 霍夫变换
def find_lines(self):
    pic=cv2.imdecode(np.fromfile(self.pic_path,dtype=np.uint8),cv2.IMREAD_COLOR)
    gray=cv2.cvtColor(pic,cv2.COLOR_BGR2GRAY)
    thresh, binary=cv2.threshold(gray,160,255,cv2.THRESH_BINARY)

    dst=cv2.GaussianBlur(binary, (9,9), 0)

    img=pic.copy()
    edges = cv2.Canny(dst, 70, 150,)
    lines = cv2.HoughLinesP(edges ,1,np.pi/180, 100,minLineLength= 200, maxLineGap=200)
    slope_list=[]
    for i in range(len(lines)):
        x_1, y_1, x_2, y_2 = lines[i][0]
        if (x_1-x_2)!=0:
            slope_list.append(round((y_1-y_2)/(x_1-x_2),2))
            cv2.line(img, (x_1, y_1), (x_2, y_2), (255, 0, 0), 3)
    imgs=self.rotate_bound(img,-(math.degrees(math.atan(np.mean(slope_list)))))
    cv2.namedWindow("before",cv2.WINDOW_NORMAL)
    cv2.resizeWindow("before",1200,1200)
    cv2.imshow("before",img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

使用示例

pic_path= "pic6.png" #这里需改为实际的图片路径
rectify = RectifyBias(pic_path)
rectify.find_lines()
rectify.find_contour()

最终效果

image.png

三、总结

经过快瞳科技团队的不懈努力,项目取得了圆满成功。团队成员各司其职,通过多次尝试和优化,不仅成功解决了图片倾斜、干扰因素等难题,还实现了对不同表格形式的精准裁剪和识别。
最终,项目识别精度不仅达到了药企的要求,还实现了超越,为药企提供了高性价比的医疗化验单OCR识别解决方案,成功签订了合作协议。这不仅彰显了快瞳科技在图像识别领域的专业能力,也为公司在医疗行业的业务拓展树立了良好的口碑,为未来更多的医疗信息化项目奠定了坚实基础。

相关文章
|
文字识别 异构计算 Python
关于Github中开源OCR项目的实验过程与思考
新手尝试Git clone Python OCR项目,遇到各种报错。测试了Paddle OCR、Tesseract OCR和EasyOCR。Paddle OCR因平台限制未能在Notebook部署,Tesseract OCR在Colab成功但无法复现。EasyOCR最终在阿里云天池和Colab部署成功,但天池GPU资源不足。建议使用魔搭社区的实例,阿里云提供免费OCR服务。寻求简单OCR项目推荐。附EasyOCR安装和使用代码。
314 2
|
5月前
|
机器学习/深度学习 文字识别 自然语言处理
医疗行业化验单智能识别技术探讨:OCR与表格识别的应用
本文探讨了OCR与表格识别技术在医疗化验单处理中的应用,通过自动化数据提取和录入,显著提高了效率和准确性,降低了人工劳动强度和错误率。技术实现包括图像预处理、文字识别和表格解析等核心算法的优化,支持与医院信息管理系统集成,未来将向跨模态数据融合、多语言适配及数据安全方向发展。
582 9
|
6月前
|
存储 人工智能 文字识别
AI与OCR:数字档案馆图像扫描与文字识别技术实现与项目案例
本文介绍了纸质档案数字化的技术流程,包括高精度扫描、图像预处理、自动边界检测与切割、文字与图片分离抽取、档案识别与文本提取,以及识别结果的自动保存。通过去噪、增强对比度、校正倾斜等预处理技术,提高图像质量,确保OCR识别的准确性。平台还支持多字体识别、批量处理和结构化存储,实现了高效、准确的档案数字化。具体应用案例显示,该技术在江西省某地质资料档案馆中显著提升了档案管理的效率和质量。
499 1
|
10月前
|
文字识别 容器
印刷文字识别使用问题之是否支持医疗检测报告识别
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
10月前
|
文字识别 Java Spring
文本,文字识别,SpringBoot服务开发,SpringBoot如何提供上传服务,接口的设计,它做了将Base64重新转为图片,SpringBoot的应用实例,项目基础搭建
文本,文字识别,SpringBoot服务开发,SpringBoot如何提供上传服务,接口的设计,它做了将Base64重新转为图片,SpringBoot的应用实例,项目基础搭建
|
存储 文字识别 算法
基于飞桨实现项目2 中文场景文字识别
基于飞桨实现项目2 中文场景文字识别
341 0
基于飞桨实现项目2 中文场景文字识别
|
文字识别
【OCR学习笔记】9、OCR中文项目综合实践(CTPN+CRNN+CTC Loss原理讲解)(三)
【OCR学习笔记】9、OCR中文项目综合实践(CTPN+CRNN+CTC Loss原理讲解)(三)
277 0
|
机器学习/深度学习 文字识别 算法
【OCR学习笔记】9、OCR中文项目综合实践(CTPN+CRNN+CTC Loss原理讲解)(二)
【OCR学习笔记】9、OCR中文项目综合实践(CTPN+CRNN+CTC Loss原理讲解)(二)
469 0
|
机器学习/深度学习 文字识别 算法
【OCR学习笔记】9、OCR中文项目综合实践(CTPN+CRNN+CTC Loss原理讲解)(一)
【OCR学习笔记】9、OCR中文项目综合实践(CTPN+CRNN+CTC Loss原理讲解)(一)
583 0
|
SQL 机器学习/深度学习 人工智能
王炸:这个GitHub 20000+ Star的OCR项目迎来四大重磅升级
王炸:这个GitHub 20000+ Star的OCR项目迎来四大重磅升级
869 0