基于MATLAB的答题卡识别系统

港控/mmm° 2022-09-04 06:49 292阅读 0赞

题目名称:基于MATLAB的答题卡识别系统
摘 要
背景:
随着科技的发展,电子与计算机技术的进步,答题卡的出现大大减轻教学工作者们批改试卷的工作量。答题卡是光标阅读机输入信息的载体,是配套光标阅读机的各种信息录入表格的总称。 答题卡将用户需要的信息转化为可选择的选项,供用户涂写。OMR是用光学扫描的方法来识别按一定格式印刷或书写的标记,并将其转换为计算机能接受的电信号的设备,并根据信息点的涂与未涂和格式文件设置将信息还原。因此,如何将答题卡填涂的黑色区域识别出来并使用计算机进行处理是极为关键的。本论文探索了有效识别答题卡的方法,以matlab为工具,基于数字图像处理技术对答题卡填涂区域进行了识别,并对识别的结果进行了处理,得到了结果。本论文利用Hough变换的直线检测技术检测图像的倾斜度,判断图像是否倾斜,对存在倾斜的图像进行旋转校正。最终实现答题卡答案的定位和检测。论文使用像素统计方法进行识别,利用黑白颜色灰度值的巨大差异对二值图像的灰度值进行累加并进行阈值判定,识别错误效率极低,能够准确的识别答题卡的涂卡标记。
关键词:Hough变换,答题卡识别,matlab,

一、设计任务、目的和要求
本设计以matlab为工具利用数字图像处理技术对答题卡进行了识别,并对识别结果进行了处理。注意到答题卡在采集图像的过程中由于各种原因可能会产生图像倾斜、水平或垂直错位,要进行正确识别首先必须对其进行校正,再依据像素检索技术进行识别。

二、总体方案设计
说明系统运行环境,编程软件平台,编码算法原理,算法流程图设计
本系统运行在当今主流的Windows7系统,使用较新的MATLAB2012b进行设计。在进行旋转校正时,先使用Hough变换检测出答题卡边缘直线,调用lines函数的参数得到倾斜角度并进行旋转变换从而消除答题卡倾斜状态。将扫描部分分为7个扫描区域,分别使用像素检索技术,对各个检索区域内的灰度值进行累加,并对累加和进行阈值判定,从而得出检索区域颜色,完成判定。最后再与标准答案进行比对,得出成绩。

流程图:
在这里插入图片描述
在这里插入图片描述

三、程序设计

  1. clc;clear;close;
  2. A=imread('原图.jpg');%读取图像
  3. imshow(A),title('原图');
  4. gray=rgb2gray(A);
  5. bw=edge(gray,'canny');%canny算子边缘检测得到二值边缘图像
  6. [h,t,r]=hough(bw,'RhoResolution',0.5,'ThetaResolution',0.5); %Hough变换
  7. figure,imshow(imadjust(mat2gray(h)),'XData',t,'YData',r,'InitialMagnification','fit'),title('Hough变换矩阵');%显示Hough变换矩阵
  8. xlabel('\theta'),ylabel('\rho');
  9. axis on, axis normal,hold on;
  10. P=houghpeaks(h,2);
  11. x=t(P(:,2));y=r(P(:,1));
  12. plot(x,y,'s','color','r'),title('');%获取并标出参数平面的峰值点
  13. lines=houghlines(bw,t,r,P,'FillGap',5,'Minlength',7);%检测图像中的直线段
  14. figure,imshow(gray);
  15. hold on;
  16. max_len=0;
  17. for i=1:length(lines)
  18. xy=[lines(i).point1;lines(i).point2];
  19. plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','g');%用绿色线段标注直线段
  20. plot(xy(:,1),xy(1,2),'x','LineWidth',2,'Color','y');
  21. plot(xy(:,1),xy(2,2),'x','LineWidth',2,'Color','r');%标注直线段端点
  22. end
  23. x=lines.theta;%由与图像边缘平行的直线段的斜率得到整个图像旋转的角度
  24. B=imrotate(gray,x);%图像修正
  25. figure,imshow(B),title('旋转后图像');
  26. T=graythresh(B);%使用OTSU方法获得阀值T
  27. result=im2bw(B,T);%二值化图像
  28. figure,imshow(result),title('二值化后结果');
  29. %扫描区域:在本程序中,有7个扫描区域,分别对应题号为1-5,6-10,11-15,16-20,21-25,26-30,31-35这几个区域
  30. n=52;m=244;% 首先测得答题区域第一题A选项左上角的坐标(52,244
  31. s=60;t=90;%s为上下两个扫描区域的距离,t为左右两个扫描区域的距离。
  32. P=4;Q=5;%P为字母项的个数(这里有ABCD共有4项),Q为每个小区域选项数。
  33. interval_length=14;%左右相邻两题填涂区域左边线的距离
  34. interval_width=9;%上下相邻两题填涂区域上边线的距离
  35. length=11;%填涂区域的长度
  36. width=6;%填涂区域的宽度
  37. a2=zeros(4,5);%初始化灰度值统计矩阵
  38. %第1-5题区域的检测
  39. for P=1:4
  40. for Q=1:5
  41. %m=244;n=52;%第1-5题区域的检测的起始坐标(即第一题A选项左上角的坐标)
  42. a1=result(m+(P-1)*(interval_width+1) :m+(P-1)*(interval_width+1)+width,n+(Q-1)*(interval_length+1):n+(Q-1)*(interval_length+1)+length);
  43. %得到矩形区域内各像素的灰度值
  44. sum1=sum(sum(a1));%计算统计的矩形区域内像素灰度值之和
  45. a2(P,Q)=sum1;%多次循环后得到20个统计区域的灰度值,并依次放在a2矩阵中
  46. end
  47. end
  48. a2(a2<80)=1;
  49. a2(a2>=81)=0;%对灰度值统计矩阵里的数值进行处理,大于某一阀值的值赋1,其余的赋0
  50. %在此程序中,涂黑则相应数值为1
  51. result1_5=a2;%存储1-5题的结果
  52. %第6-10题区域的检测
  53. for P=1:4
  54. for Q=1:5
  55. a1=result(m+s*1+(P-1)*(interval_width+1) :m+s*1+(P-1)*(interval_width+1)+width,n+(Q-1)*(interval_length+1):n+(Q-1)*(interval_length+1)+length);
  56. sum1=sum(sum(a1));
  57. a2(P,Q)=sum1;
  58. end
  59. end
  60. a2(a2<80)=1;
  61. a2(a2>=81)=0;
  62. result6_10=a2; %存储6-10题的结果
  63. %第11-15题区域的检测
  64. for P=1:4
  65. for Q=1:5
  66. a1=result(m+(P-1)*(interval_width+1) :m+(P-1)*(interval_width+1)+width,n+t*1+(Q-1)*(interval_length+1):n+t*1+(Q-1)*(interval_length+1)+length);
  67. sum1=sum(sum(a1));
  68. a2(P,Q)=sum1;
  69. end
  70. end
  71. a2(a2<80)=1;
  72. a2(a2>=81)=0;
  73. result11_15=a2; %存储11-15题的结果
  74. %第16-20题区域的检测
  75. for P=1:4
  76. for Q=1:5
  77. a1=result(m+s*1+(P-1)*(interval_width+1) :m+s*1+(P-1)*(interval_width+1)+width,n+t*1+(Q-1)*(interval_length+1):n+t*1+(Q-1)*(interval_length+1)+length);
  78. sum1=sum(sum(a1));
  79. a2(P,Q)=sum1;
  80. end
  81. end
  82. a2(a2<80)=1;
  83. a2(a2>=81)=0;
  84. result16_20=a2; %存储16-20题的结果
  85. %第21-25题区域的检测
  86. for P=1:4
  87. for Q=1:5
  88. a1=result(m+s*2+(P-1)*(interval_width+1) :m+s*2+(P-1)*(interval_width+1)+width,n+t*1+(Q-1)*(interval_length+1):n+t*1+(Q-1)*(interval_length+1)+length);
  89. sum1=sum(sum(a1));
  90. a2(P,Q)=sum1;
  91. end
  92. end
  93. a2(a2<80)=1;
  94. a2(a2>=81)=0;
  95. result21_25=a2; %存储21-25题的结果
  96. %第26-30题区域的检测
  97. for P=1:4
  98. for Q=1:5
  99. a1=result(m+s*3+(P-1)*(interval_width+1) :m+s*3+(P-1)*(interval_width+1)+width,n+t*1+(Q-1)*(interval_length+1):n+t*1+(Q-1)*(interval_length+1)+length);
  100. sum1=sum(sum(a1));
  101. a2(P,Q)=sum1;
  102. end
  103. end
  104. a2(a2<80)=1;
  105. a2(a2>=81)=0;
  106. result26_30=a2; %存储26-30题的结果
  107. %第31-35题区域的检测
  108. for P=1:4
  109. for Q=1:5
  110. a1=result(m+s*4+(P-1)*(interval_width+1) :m+s*4+(P-1)*(interval_width+1)+width,n+t*1+(Q-1)*(interval_length+1):n+t*1+(Q-1)*(interval_length+1)+length);
  111. sum1=sum(sum(a1));
  112. a2(P,Q)=sum1;
  113. end
  114. end
  115. a2(a2<80)=1;
  116. a2(a2>=81)=0;
  117. result31_35=a2; %存储31-35题的结果
  118. answer=[result1_5,result6_10,result11_15,result16_20,result21_25,result26_30,result31_35];%将所检测的7个区域的结果汇总
  119. dlmwrite('Result.txt',answer);%以txt文本的形式输出结果矩阵
  120. disp(answer);%在command窗口实时显示结果
  121. %附加一个统计错误的并显示分数的部分,假定正确答案是35C
  122. T=zeros(4,35);%初始化矩阵
  123. T(1,:)=1;%设定正确答案的参数
  124. mark1=answer-T;
  125. wrongx=sum(mark1~=0);%当结果选错时,每一列将分别多一个1与-1。选择正确时,此列都是0
  126. A=sum(sum(wrongx));%统计非零的结果。
  127. wrong=A/2;%由于-11是成对出现的,所以需要将上一步所得结果除以2.
  128. score=35-wrong;%算出结果
  129. fprintf('选择题得分为%d',score);%在command窗口输出成绩

四、模块测试与分析
1、首先进行Hough变换,得到Hough变换矩阵如下所述(见图1)。
在这里插入图片描述

  1. 1

可以观察到2个峰值。

2、使用Houghlines函数检测直线,得到如下结果(见图2)
在这里插入图片描述

  1. 2

并使用lines.theta语句得到直线角度,即为图像倾斜角度。
x=lines.theta x =4
3、修正图像(如图3所示)
在这里插入图片描述

  1. 3

这时观察到倾斜的图像已经得到改正。
4、在二值化后使用像素检索技术对灰度值进行统计。分为7个扫描区域,如图4中7个方框所示。
在这里插入图片描述

图4
5、进行灰度统计,得到结果矩阵。最后处理由fprintf语句得到分数。
框架思路链接:点击下载,电脑更佳
五、测试与调试过程
这次实验遇到的第一个问题是如何由Hough变换得到直线角度。这个是教材上没有的。网上提示说是调用lines函数,但没有说怎么调用。后来才从一篇Hough变换的文章中知道是lines.theta,类似于C#的调用方法。还有就是在本次设计中我第一次是将旋转部分和灰度值统计部分分开写成2个m文件的,然后再直接合并,结果发现有误。经过检查后发现matlab在读取图片时会在原图片外加一圈白色“幕布”,导致原图片的长与宽发生变化,使原图片中的坐标也发生变化。因此最后还得重新修改相关参数。
六、结果与心得体会
扫描矩阵为,注意观察其中1出现的位置,和答题卡中填涂区域完全一致,所以可知此方法成功的进行地对答题卡进行了识别。
Columns 1 through 9

  1. 1 0 0 0 0 0 0 0 0
  2. 0 0 0 0 1 1 0 1 1
  3. 0 0 1 1 0 0 1 0 0
  4. 0 1 0 0 0 0 0 0 0

Columns 10 through 18

  1. 0 1 0 0 0 0 0 0 0
  2. 0 0 0 0 1 0 1 0 1
  3. 1 0 1 1 0 1 0 1 0
  4. 0 0 0 0 0 0 0 0 0

Columns 19 through 27

  1. 0 0 0 0 0 0 0 1 0
  2. 0 0 1 1 0 0 0 0 1
  3. 1 0 0 0 1 0 1 0 0
  4. 0 1 0 0 0 1 0 0 0

Columns 28 through 35

  1. 0 0 0 1 0 0 0 0
  2. 0 1 1 0 1 0 0 0
  3. 1 0 0 0 0 0 0 1
  4. 0 0 0 0 0 1 1 0

输出结果为得分为4分,与预期值也相符(假定正确答案是35个A)

发表评论

表情:
评论列表 (有 0 条评论,292人围观)

还没有评论,来说两句吧...

相关阅读

    相关 基于MATLAB形态学识别

    基于MATLAB的形态学答题卡识别 形态学图像处理是数字图像处理中的一种重要技术,它通过对图像的形状和结构进行分析和操作,实现对图像的增强、分割和特征提取等功能。在教育考试领

    相关 基于MATLAB人民币识别系统

    一、课题介绍 本设计为基于MATLAB的人民币识别系统。带有一个GUI界面。先利用radon进行倾斜校正,根据不同纸币,选择不同维度的参数识别纸币金额,有通过RGB分量识别1

    相关 基于Matlab车牌识别系统

    摘要:车牌识别技术是智能交通系统的重要组成部分,在近年来得到了很大的发展。本文从预处理、边缘检测、车牌定位、字符分割、字符识别五个方面,具体介绍了车牌自动识别的原理。并用MAT

    相关 基于MATLAB发票识别系统

    一、课题背景 本发明涉及了一种基于OCR图像识别技术的发票采集管理系统及方法,该系统的发票信息采集单元采集发票图片信息数据,OCR图像识别单元基于OCR图像识别技术并结合人工