血常规检验报告的图像OCR识别
用户上传一张血常规报告单的图片,提交的结果是图片存储到了mongodb数据库得到一个OID或到指定目录到一个path。图片识别得到一个json数据存储到了mongodb数据库得到一个OID,json数据。自动截取目标区域,不同旋转角度的图片自动准备截取目标区域,处理。ocr识别得出每项的数值,上部是原始图片,下部是一个显示识别数据的表格,以便对照识别结果。最后根据血常规检验的各项数据预测年龄和性别。
代码
https://git.coding.net/wangjjj/np2016.git
运行环境
# 安装numpy,
sudo apt-get install python-numpy # http://www.numpy.org/
# 安装opencv
sudo apt-get install python-opencv # http://opencv.org/
##安装OCR和预处理相关依赖
sudo apt-get install tesseract-ocr
sudo pip install pytesseract
sudo apt-get install python-tk
sudo pip install pillow
# 安装Flask框架、mongo
sudo pip install Flask
sudo apt-get install mongodb # 如果找不到可以先sudo apt-get update
sudo service mongodb started
sudo pip install pymongo
# 安装tensorflow
$ sudo apt-get install python-numpy
$ sudo apt-get install python-imaging
$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.12.0rc0-cp27-none-linux_x86_64.whl
运行
cd BloodTestReportOCR
python view.py # upload图像,在浏览器打开http://yourip:8080
运行结果
-
web首页,可进行血常规检验报告图片的上传
-
提交图片系统显示处理过的合格图片
-
点击生成报告得出识别结果
-
点击预测,得出结果
项目模块
- 图片处理及orc识别
- 对整张图片做预处理及线段检测
#灰度化
img_gray = cv2.cvtColor(self.img, cv2.COLOR_BGR2GRAY)
#高斯平滑
img_gb = cv2.GaussianBlur(img_gray, (gb_param,gb_param), 0)
#canny算子边缘检测
edges = cv2.Canny(opened, canny_param_lower , canny_param_upper)
#调用CV2模块的findContours提取矩形轮廓,筛选对角线大于阀值的轮廓
contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)
#求最小外接矩形
def getbox(i):
rect = cv2.minAreaRect(contours[i])
box = cv2.cv.BoxPoints(rect)
box = np.int0(box)
return
将轮廓变成线:比较最小外接矩形相邻两条边的长短,以两条短边的中点作为线的两端;
若线数量大于三则根据线长短继续筛选长线。根据三条线间的距离确定表格头部和内容的位置;
- 透视变换
#使用透视变换将表格区域转换为一个1000*760的图
PerspectiveMatrix = cv2.getPerspectiveTransform(points,standard)
self.PerspectiveImg = cv2.warpPerspective(self.img,PerspectiveMatrix, (1000, 760))
-
将图片内容分割为个别的数据,返回正面图与报告单内容每项的剪切图 ,在temp_pics文件夹中生成
- 对每份数据调用pytesserac的OCR库进行识别
- 预测
网友评论