基于MATLAB的答题卡识别系统
1、答题卡识别的意义
在现代教育事业的飞速发展中,考试已经成为现代教育事业中最公平的方式方法,而且也是衡量教与学的唯一方法。通过考试成绩的好与坏,老师和家长可以分析出学生掌握的知识多少和学习情况。从而老师可以了解到自己教学中的不足来改进教学的方式方法,提高教学的水平。学生也可以通过考试了解到自身学习的不足,从而有针对性的进行学习。考试也是进行人才的选拔和评价的重要方法。不论是找工作应聘,还是单位内部的晋升都需要进行考试。
由于考试具有一定的特殊性,而且考试必须要公平公正,当然其中最重要的就是阅卷的准确性。考生做好了题,这时就需要改卷老师阅卷的准确性,这样才能更准确的给考生真实的分数。传统的阅卷方式为流水线的手工作业方式。这样的方式存在很多的问题,因为很容易受到阅卷者的主观因素的影响,从而产生一定的偏差。所以很多人就讨论如何将人为的因素降低到最低,来确保考生的考试成绩的公平公正和准确。
随着考试题型的多样化,特别是选择题在考试中所占据的比重越来越多,比如说像英语考试、公务员考试、企业的心理测试等,都是以选择题为主。由于选择题不具有主观性,所以为了阅卷的方便与准确,人们开始研究如何使用计算机来代替人工进行阅卷。最终出现了基于计算机的答题卡自动阅卷系统
2、答题卡识别系统的国内外发展现状及一般方法
随着计算机技术的飞速发展,阅卷系统也得到了成熟的发展。自动阅卷系统涉及多个学科领域,其中数字图像处理是这个学科中最关键最重要的一部分,它是国内外教育事业发展领域的研究热点之一。
国外是率先采用计算机技术自动阅卷系统,1966 年在美国的杜克大学,
Ellis Page 等团队经过努力研发了第一个自动评分的系统叫做 PEG(Project Essay Grade)[1],它主要是针对于文章的内在特征进行句子意思的分析,将文章的特征进行量化,采用人工评估得分的方式给出结果,从这些结果中找出一系列的特征进行训练,得出一个与之相关的分析性值,用这个值对待批阅的文章进行批阅。在此后还出现了 LSA(Latent Semantic Analysis)系统[2],这个系统最重要的功能就是将每一篇文章看作是一个在空间的向量,向量的每一行表示文档的特征,而每一列表示文档的向量,每一个文本都会产生一个矩阵。再用余弦的方法计算文本向量与将要批阅的文本向量的相似度,最后给出评价。1970 年,欧
美几个发达国家开始研制光标阅读机,在答题卡识别系统方面研究比较成熟的系统是 Remark Office 软件[2],填涂的区域是圆形,这些系统具有较好的经济价值,然而当这些系统投入市场后,得到了大多数使用者的青睐,然而在相关技术方面公布的资料都很少,限制了研究者以及开发者其研究和开发。
在 80 年代初期,我国才开始对自动阅卷系统进行研究。在 1988 年的高考的阅卷中进行了试点,取得了不错的成绩。这个阅卷系统就是山东大学和重庆大学首先研发的。此后 1990 年,国家教育部的考试中心把这项阅卷技术列为教育发展的重要项目,并大力鼓励各科研单位进行研究这个阅卷系统,1992 年已有多个科研单位研制的自动阅卷系统通过国家审核,并用于各种标准化考试中。由于随着计算机科学技术的高速发展和数字图像处理技术的成熟,近年来人们开始研究基于图像处理的答题卡阅卷系统,处理效果也相对比较好,已经有不少公司开发的阅卷系统投入了市场。
3、实现的主要功能
由于现在市场上的答题卡众多,而且不同公司的答题卡都要使用它们公司的阅卷系统。本文主要是研究利用 MATLAB 软件来实现用数字图像处理技术来识别标准答题卡。这个研究主要是针对如何识别答题卡以及如何编写软件系统设计。
课题的研究内容如下:
- 确定答题卡识别系统的整体方案,包括系统整体的框架以及硬件组成、软件开发方案,其中主要是软件方面的开发。
- 确定数字图像处理的算法,包括图像预处理、图像的倾斜级旋转校正、二
值变换等。通过分析和比较多种处理方法,结合图像本身的一些特点最后确定使用 Hough 变换来检测图像中的直线的倾角,并通过旋转图像使图像进行矫正。
- 研究了如何利用 MATLAB 软件对填涂答案区域的识别和对学号区域的识别,
准确有效的实现了对学号的提取和答案的提取,不论是多选还是单选。
- 利用 MATLAB 完成了系统的软件部分的编程设计,最主要的是实现了将答题卡中被填涂的答案提取出来,然后与标准的答案进行比对。通过相关的计算, 算出考生填涂正确的题数,并统计计算后的得分。
- 将统计的得分与实际的得分情况进行对比,并分析原因。
4、算法流程图
开始
图像输入
图像的预处理
边缘检测
直线检测
图像校正
学号剪切
多选题剪切
单选题剪切
识别学号
识别答案
输出学号和计算得分
4.1、答题卡图像预处理部分
图 软件系统流程图
答题卡的图像预处理是这个设计的前期处理,是保证之后的设计能顺利进行的前提。将答题卡通过扫描仪生成数字图像后,在 MATLAB 中输入图像,显示出原图像。这时要对答题卡进行数字图像处理,首先要进行灰度变换形成灰度图像, 因为在做图像处理时灰度图像就是基础。生成的灰度图像如图 3.2:
图 3.2 答题卡的灰度图
通过比较选取变换范围为[0.3,0.7]的灰度图最理想。变换成为灰度图后在对图像进行二值化,生成的答题卡二值图如图 3.3:
图 3.3 答题卡二值化图
图片经过改变不同的二值化的阈值,通过比较得出当阈值为 0.5 时比较有利于之后的图片处理。因为这样的到的图片可以使学生在填涂答案是即使不是特别的完美也能识别涂黑的部分。经过二值化后就要对图像进行滤波,去除图片中出现的噪点,让图片看起来更平滑。滤波后的图如图 3.4:
图 3.4 答题卡中值滤波图
4.2、答题卡图像边缘检测和直线检测
由于答题卡在用扫描仪扫描图片进入电脑时,可能会出现答题卡的偏移,这时就需要对答题卡进行校正,所以需要对答题卡进行直线检测。将答题卡进行边缘检测是为了可以更明确提取出答题卡的特征,由于提取答题卡图像的直线,需要对答题卡进行 Hough 变换。所以要对答题首先进行一次边缘检测。使用的函数为 edge 函数得到的图像如图 3.5:
图 3.5 答题卡边缘检测图
对图像进行 Hough 变换后通过检测图像变换后的峰值点,然后通过
houghlines 函数的计算可以检测出图像中的直线,在本课题的答题卡中可以检测出 4 根直线。如图 3.6:
图 3.6 答题卡直线检测图
检测出了答题卡中的直线之后,需要对答题卡进行校正。如果要对图像进行校正首先就要知道图片倾斜了多少度,通过计算图片中的直线的斜率就可以就算出图片的倾斜的角度。然而图片中有4条直线如何选取呢?这时就需要在MATLAB 中进行编程计算出哪条直线是图片中最长的直线,每条直线的两端的点可以通过
lines(k).point1;lines(k).point2求得。利用两点之间直线距离公式可以计算出两点之间的距离,选取距离最长的那条直线。
通过求得最长的直线,这时我们可以通过求直线斜率的公式:
K = −
−
在MATLAB中 2 − 分别对应了lines(Index1).point1(2)和
(3.1)
lines(Index1).point2(2)而 2 − 分别对应了lines(Index1).point1(1)和
lines(Index1).point2(1)其中Index1就是最长的那条直线。通过MATLAB的计算我们可以算出图像中最长的直线的斜率K=7.1145。然后根据斜率对角度的变换, 可以求出图像的倾斜的角度。计算角度的公式为:
rotate = atan(K) 18 pi (3.2)
通过公式可以求出rotate=81.990度,计算出了角度之后就是要对图像进行旋转校正。在MATLAB的工具箱中提供了图像旋转的函数为imrotate函数。由于求出了旋转角度所以通过旋转后的图像如图3.7:
4.3、学号识别部分
图 3.7 答题卡旋转校正图
通过对图像进行分析,我们可以定位出学号的位置,通过剪切可以剪切出学号的图像。在 MATLAB 中可以通过剪切图像的函数 imcrop 来剪切图像,函数调用格式为:
J = imcrop(I, X, Y, WIDTH, HEIGHT) (3.3)
其中 J 为剪切后返回的图像,I 为需要剪切的图像,X,Y 为在 I 图像中需要剪切的图像的起始坐标,而 WIDTH 和 HEIGHT 为图像从起始坐标开始到需要剪切的像素距离。剪切后的图像如图 3.8:
图 3.8 剪切的学号图和学号二值图
将剪切后的图像进行分析对比。通过多次实验方法的比较最终选取了比较可靠的识别方案。为了将把黑色填涂了的区域识别出,并且要识别出所涂的学号数字,首先要进行一次学号数字的定位。经过多次的比较,本次课题采用了两次
FOR 循环,每次循环时就是将剪切的学号图在进行一次剪切,通过两次循环可以把学号图每个数字小方块都剪切出来。然后通过计算剪切后的小方块中像素的个数来确定此小方块是否被填涂。确定了填涂之后,通过此小方块的剪切坐标, 可以求出小方块的位置数字是多少,比如说在竖直方向,循环的时候当竖直方向的值为 8 时,如果小方块被填涂,则学号数字就为 1。在此过程中需要进行一次计数,因为学号都是有数字顺序的。所以需要建立一个数组来记录学号的顺序。当循环从上往下从左往右开始扫描时,当第一列有填涂时,记录数字,并让计数函数加 1。计算后如图 3.9:
4.4、答案识别部分
图 3.9 计算出的学号图
答题卡识别系统最关键的部分就是识别考生的答案,只有能准确的识别出考生的答案,才能算是代替了人工进行阅卷。在识别答案时考虑到了试卷题型的多
样性所以进行了两种题型的选择,单选题和多选题。在单项选择题方面,识别的方案与学号的识别方案基本一致,也是将填涂单项选择题的区域进行分割剪切。由于在标准答题卡中,选择题号是由上往下,而且每 5 道题形成一块区域,则在进行分割剪切时,就需要进行多次循环,一个填涂区域的大模块的位置坐标的循环。当第一次循环过后分割出第一块 5 道题的区域,然后再进行二次循环,这时
就可以把剪切出来的 1 至 5 题的区域在进行更细小的分割,分割出那需要填涂的一个个小方块。剪切的单选答案图如图 3.10:
图 3.10 剪切的单选答案图
这时需要计算哪块小方格被填涂并记录相应的题号,所记录填涂的答案的方法与记录学号的方法一至。在 MATLAB 中由于记录 A,B,C,D 进入数组中不方便计算,于是我用 1,2,3,4 来代替了 A,B,C,D。由于单向选择有 45 到题,所以通过计算 MATLAB 程序计算出的单项选择答案如图 3.11:
图 3.11 单项选择答案图
计算出了单选选择答案后,需要与标准的答案进行对比。这时需要建立一个二维的数组来储存标准答案。在程序中建立了一个名字叫做 bzdaan 的数组,只有一行却有多个列,来记录每一道单项选择题的标准答案。记录好考生填涂的答案和标准答案后,这时通过一个 FOR 循环一一对比,如果相同的就让计数器加一如果不同计数器就不加。循环结束后就可以统计出考生选对的答案,然后将统计
好的数字乘上每道题的分数就可以计算出考生单选题的得分。
然而在进行多项选择题时就比较复杂,因为单选选择题,只有三种情况,一种是选错,一种是选对,还有一种就是不选。然而在多项选择题中,除了以上三种情况以外还有就是少选,和多选的情况。所以在进行答案的识别提取时候就需要对所编的程序要求更高。在识别答案时方法与单选题的方法都是一致的都是将多项选择的区域进行分割剪切,剪切的多项答案图如图 3.12:
图 3.12 剪切的多选答案图
然后再统计。然而在记录考生所选的答案的时候就需要改变程序,在第二层
FOR 循环时将 num2 自加一,这样才能实现一道题的多个答案的记录。
通过多次试验和比较,最后在设计程序来记录答案时,添加了一个二维的数组这个二维数组与单项选择的数组不一样,这个数组横纵坐标都是一个变化的数值,在程序中叫做 dzimu(num3,num2)。通过循环和计数,统计出了一个矩阵数组来记录多项选择的答案。多项选择答案图如图 3.13:
图 3.13 多项选择题答案图
求出多项选择题答案后,需要建立一个标准的多项选择题的答案库,来进行对比。建立一个数组 bzdaan 来记录标准答案,由于有多选和漏选所以,在进行对比时首先将两个数组相减,建立一个 cha 的数组来储存相减的数值。如果是正确的答案相减就为零,如果是漏选相减后的差值就为正数,反之多选的就为负数。通过这样的相减后,可以得出,如果一行里面负数则这道题就为零分,如果这道题里面有正数则表示这道题答案没有选完。详细程序见附录。
4.5、得分计算部分
计算出单选答案的个数后乘以相应的每道题的分数,就可以得出考生单项选择的答案。在程序中记录单选的分数函数为 fenshu1。在统计多选的得分时,有两种情况,一种是全选对的得全分,选对部分的得一部分的分,而选错的不得分, 通过程序设计可以分别得出选错的个数和选对一部分的个数。让多选的总得分减去选错的个数乘以相应的分数,再减去选对部分的个数乘以相应的分数就可以求出该考生的得分。考生学号和成绩图如图 3.14:
图 3.14 考生的学号和成绩图
5、实现效果示例
经过多次反复检查程序并运行,程序没有出错而且程序基本能实现要求。在对系统进行测试时,运行环境:主机为 DELL 笔记本,主频为 2.1GHz,内存为 2GB,操作系统为 window7 64 位旗舰版,MATLAB 软件版本为 2014。
扫描了 20 份填涂好的学生答题卡。只填涂了 60 道题,其中前 45 道题为单
向选择题,每道单选题的分值为 1 分。后 15 道题为多项选择题,每道多项选择
题的分值为 3 分,少选只得 2 分,而选错或者是多选不得分,这样总分为 90 分。
通过程序识别每张答题卡为 5 秒,识别 20 张答题卡用时 100 秒,识别准确率 99%, 识别的考生学号和对应成绩如表 4-1。
表 4-1 考生的成绩对比及结论
考生学号 | 识别成绩 | 真实成绩 | 结论 |
080602201 | 66 | 66 | 准确 |
080602202 | 80 | 80 | 准确 |
080602203 | 78 | 78 | 准确 |
080602204 | 76 | 76 | 准确 |
080602205 | 67 | 67 | 准确 |
080602206 | 58 | 58 | 准确 |
080602207 | 87 | 87 | 准确 |
080602208 | 56 | 57 | 不准确 |
080602209 | 77 | 77 | 准确 |
080602210 | 88 | 88 | 准确 |
080602211 | 64 | 64 | 准确 |
080602212 | 57 | 57 | 准确 |
080602213 | 78 | 78 | 准确 |
080602214 | 57 | 57 | 准确 |
080602215 | 76 | 76 | 准确 |
080602216 | 82 | 82 | 准确 |
080602217 | 73 | 73 | 准确 |
080602218 | 71 | 71 | 准确 | ||
080602219 | 70 | 70 | 准确 | ||
080602220 | 69 | 69 | 准确 |
举例对应的识别考生学号和成绩如图 4.1:
图 4.1 识别的考生学号和成绩图
每张答题卡的学号和该学号所对应考生的分数都与实际的分数一致。只有少部分答题卡在填涂时由于力度等原因填涂不清晰,所以未能识别出答案,系统自动识别为漏选。
此识别系统与现有的其他识别系统运行速度相差不大,准确率也比较高,所以
该系统是可行的。