利用MATLAB进行答题卡识别编程设计,最主要的是实现了将答题卡中被填涂的答案提取出来,然后与标准的答案进行比对。通过相关的算法,算出考生填涂正确的题数,并统计计算后的得分。
每种答题卡都有很明显的助识别标记,像下图中的这种,最右边的一竖溜小横杠是帮助定位选项的,还有准考证号下方的横线、最下边的横线是用来矫正图像的。
首先进行初步的滤波,突出学生填图的部分和帮助识别的符号,其他的东西不重要。所以这里要做的事情就是增强对比度和去掉一些拍照(扫描)时产生的噪音,可以使用局部直方图均衡化和形态学去噪的方法,对于局部直方图均衡化可以使用MATLAB中imadjust函数来完成,其原理就是将某一阈值内低灰度的显示范围扩大,阈值外的部分归于255。
矫正图像,是识别前的必须准备,因为要使用hough变换来检测图像中的直线,hough变换只能研究二维函数,所以要把图像二值化,然后找到右边的一竖溜小横杠所在的位置,根据直线的偏转角度来使图像旋转完成矫正。转换为二值图像时的阈值选择要留意,人为不好确定的情况下,最好使用graythresh来确定,或者是其他更可行的方法。
再用一次hough变换将答题卡信息和填图区域分开(就是检测准考证号与选项中间的那条横线),使用regionprops函数将不同的连通域进行定位后,便可编写相应程序识别出选项和考生信息。
由图像处理部分标记出答案后,需要与标准的答案进行对比。这时需要建立一个二维的数组来储存标准答案。在程序中建立了一个数组,只有一行却有多个列,来记录每一道单项选择题的标准答案。
记录好考生填涂的答案和标准答案后,这时通过一个for循环一一对比,如果相同的就让计数器加一如果不同计数器就不加。循环结束后就可以统计出考生选对的答案,然后将统计好的数字乘上每道题的分数就可以计算出考生单选题的得分。
答题卡图像受拍摄影响较大,如拍摄时光照不均匀,对后续处理影响较大,此外拍摄时背景宜选纯白色,提高目标区域定位准确性。
点击打开图像并阅卷按钮,选择对应图片进行阅卷,如下图所示:
得到学号与成绩信息,标准答案保存在StanderAnswers.xls文件中,如下图所示:
项目资源下载请参见:MATLAB实现OCR自动阅卷,自动识别答题卡进行成绩统计