毕业设计中期报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
毕业设计(论文)中期报告题目:病例识别系统实现
院(系)计算机科学与技术学院
专业计算机科学与技术
学生林陶然
学号 1
班号 1203106
指导教师张英涛
中期报告日期2016年4月25日
哈尔滨工业大学教务处制
2016年4月
目录
一.工作完成情况-----------------------------------------------------1 二.已完成的研究工作及结果-------------------------------------------1 三.目前存在的问题及解决方法-----------------------------------------5 四.后期拟完成的研究工作及进度安排-----------------------------------5 五.参考文献---------------------------------------------------------6
一、工作完成情况
经过为期一个多月的学习研究以及不断的寻求解决问题的办法,我很好地处理了通过手机拍摄的医疗表单图像,完成了对于图像的灰度处理,二值化处理,倾斜校正,去除杂质处理之后,终于将其中的关键数据分行分列的从图片中分割出来,最后将分好的每一个小块部分进行处理,获得了单个的字符,以便我以后将要进行的字符识别工作。
二、已完成的研究工作及结果
1. 对图像的预处理过程
对图像的预处理过程包括图像增强,灰度化,和二值化过程,中值滤波,倾斜校正等等。
在图像进行灰度化处理之前,由于光线环境等等问题,首先对图片进行一次自动增强操作。
调用了autoenhance() 函数,根据预先设定的效果范围来调整图像的亮度,颜色和对比度。
对图像的灰度化处理则直接使用matlab中现有的灰度图转化函数rgb2gray()即可。关于这个函数的具体内容在此就不再赘述。可以在matlab中查看。
而二值化方法的选择就显得尤为要,很大程度上影响了后续的分行分列的字符提取效果。这里我一开始采用的迭代二值化的处理方法,并发现了一些问题。由于拍照的光线不均,决定以后将采用自适应阈值法。
1.1中值滤波
Matlab中有现成的medfilt2()中值滤波函数可供调用。在此简述一下他的实现过程和作用。
中值滤波的基本原理就是把一点的值用规定的该点对应的一个邻域中各点值的中值来代替。本人所采用的是[3*3]的窗口大小。
(1)将模板中心与像素点重合;
(2)读取模板中各对应像素的值;
(3)将这些灰度值由小至大排列;
(4)取中值代替该像素点的值。
中值滤波对孤立的噪声像素即椒盐噪声、脉冲噪声具有良好的滤波效果。对于本系统来说,它消除杂点有很好的效果。
(1)选择一个初始的阈值T,T的取值方法很简单,整张图片的最高灰度值和最低灰度值之和的一半;
(2)将新的阈值TT赋值为0,并设置一个范围为allow,d=|T-TT|;
(3)遍历整张图片,将灰度值大于T的点的灰度值作和并除以个数得到平均值T0,同理,将灰度值小于T的点作处理得到T1;将T0与T1作平均得到TT,d=|T-TT|。将TT的值赋给T
(4)如果d的值大于等于预先设置的范围allow,就重复进行(3)的过程直至最后得到一个新的迭代阈值T。根据这个T将图片二值化。
(1)处理结果:
可以看到这种二值化的整体效果很好,但是部分文字有笔画丢失的现象,而且对于光照不均的图像将会产生很多的误差点。如下图
(2)产生误差的原因:迭代化的二值化方法是对整张图像的所有像素点的像素值都基于设定的范围作了平均化操作,然而对于光照不均的图像,每一个区域的阈值的allow值都应该有所不同,而迭代化二值化方法无法做到所以产生了误差。
而且对于不同的图片要自己选取合适的allow值,不够智能。
1.3对图像的倾斜校正
通过对图像的倾斜校正可以使二值化之后的图像极方便地就能获得后续的水平和垂直投影,进而使对整个图像的分块和每块中单个字符的分割变得准确而又简单。
(1)设定参数,并以此参数对二值化后的图像进行膨胀过程
(2)对膨胀后的图像进行数学形态学运算bwmorph(BW,'thin',Inf),其中thin表示操作为细化,Inf 则表示将一直对图像作同样的形态学处理直至不再发生变化。通过这步操作可以将图像缩成连通线。
(3)通过霍夫函数拟合出细化图片中的直线,并计算这条直线的斜率,转化为旋转角,对图片进行旋转。即得到了倾斜校正之后的图像。
1.3.2 倾斜校正的结果与分析
可以看到通过倾斜校正,图片变成了我们熟悉的文档格式,有着水平的行和垂直的列,下面将通过水平和垂直的投影,来将每一行每一列的信息分割出来。
1.4开运算排除干扰点
倾斜校正之后的图像我们可以看到还有很多的干扰点,通过开运算函数bwareaopen()可以排除图像中的干扰点使分割处理更加准确。下图为开运算的处理效果:
2.对图像的分割处理
由于医疗表单数据通常都是行列分明而且有着统一的格式,字与字之间都是对齐而且有间距的,通过行分割与列分割,将图像分为对应的小块,再将每一块中的字符进行识别,就可以直接将行与列的信息与以后要输出的excel表格关联起来,很便捷。
2.1对图像的行分割与列分割
在进行行分割与列分割,先要对图片的水平和垂直分量进行投影操作,通过观察投影的波形图,我们可以清楚地看到每行每列的位置与投影的波谷的对应关系。
2.1.1 水平与垂直投影过程与效果
水平(垂直)投影的获取过程很简单,先获取图像的纵(横)坐标范围,在这个大小范围内,对每一行(列)的像素值进行累加。
可以看到,上图有13行,而水平投影曲线中有13个零点,是互相对应的。
下面将以行分割为例,介绍图像分块的过程。
数组H,J分别用于保存一行的起点与结束点。
对于x坐标由i到图像的高度M遍历,如果有水平投影值由0变为非0,则将i的值赋给一个起始点H(j),如果有水平投影值由非0变为0,则将i的值赋给一个结束点J(j),并且执行j+1,表示一对起点终点已经成功记录。(即j表示第j个起始点与第j个结束点)
于是就可以得到行切割矩阵rect{i}=[0,H(i),N,J(i)-H(i)];即宽度不变,将每个行起点到行终点的部分截取下来,获得逐行的图像。切割的结果如下:
可以看到结果是非常成功的。