基于数字图像处理技术的答题卡识别方法(图像处理课程练习)_第1页
基于数字图像处理技术的答题卡识别方法(图像处理课程练习)_第2页
基于数字图像处理技术的答题卡识别方法(图像处理课程练习)_第3页
基于数字图像处理技术的答题卡识别方法(图像处理课程练习)_第4页
基于数字图像处理技术的答题卡识别方法(图像处理课程练习)_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、××大学2013-2014学年第二学期课程考核图像处理综合设计报告基于数字图像处理技术的答题卡识别方法学 号 姓 名 班 级 日 期 本人郑重声明:本人认真、独立完成了查找资料、编写程序、撰写报告等考核任务。签字:日期:摘 要背景:随着科技的发展,电子与计算机技术的进步,答题卡的出现大大减轻教学工作者们批改试卷的工作量。答题卡是光标阅读机输入信息的载体,是配套光标阅读机的各种信息录入表格的总称。 答题卡将用户需要的信息转化为可选择的选项,供用户涂写。OMR是用光学扫描的方法来识别按一定格式印刷或书写的标记,并将其转换为计算机能接受的电信号的设备,并根据信息点的涂与未涂和格式

2、文件设置将信息还原。因此,如何将答题卡填涂的黑色区域识别出来并使用计算机进行处理是极为关键的。本论文探索了有效识别答题卡的方法,以matlab为工具,基于数字图像处理技术对答题卡填涂区域进行了识别,并对识别的结果进行了处理,得到了结果。本论文利用Hough变换的直线检测技术检测图像的倾斜度,判断图像是否倾斜,对存在倾斜的图像进行旋转校正。最终实现答题卡答案的定位和检测。论文使用像素统计方法进行识别,利用黑白颜色灰度值的巨大差异对二值图像的灰度值进行累加并进行阈值判定,识别错误效率极低,能够准确的识别答题卡的涂卡标记。关键词:Hough变换,答题卡识别,matlab,一、设计任务、目的和要求本设

3、计以matlab为工具利用数字图像处理技术对答题卡进行了识别,并对识别结果进行了处理。注意到答题卡在采集图像的过程中由于各种原因可能会产生图像倾斜、水平或垂直错位,要进行正确识别首先必须对其进行校正,再依据像素检索技术进行识别。二、总体方案设计说明系统运行环境,编程软件平台,编码算法原理,算法流程图设计本系统运行在当今主流的Windows7系统,使用较新的MATLAB2012b进行设计。在进行旋转校正时,先使用Hough变换检测出答题卡边缘直线,调用lines函数的参数得到倾斜角度并进行旋转变换从而消除答题卡倾斜状态。将扫描部分分为7个扫描区域,分别使用像素检索技术,对各个检索区域内的灰度值进

4、行累加,并对累加和进行阈值判定,从而得出检索区域颜色,完成判定。最后再与标准答案进行比对,得出成绩。流程图:开始灰度化Hough变换图像旋转图像倾斜吗? 是 是 否 测量各个扫描区域的起始坐标分别依次统计各大扫描区域内各个检测区域的灰度值阈值判定,得出所检测区域颜色并赋值与标准答案比对算出成绩结束三、程序设计 clc;clear;close;A=imread('原图.jpg');%读取图像imshow(A),title('原图');gray=rgb2gray(A);bw=edge(gray,'canny');%canny算子边缘检测得到二值边缘图

5、像h,t,r=hough(bw,'RhoResolution',0.5,'ThetaResolution',0.5); %Hough变换figure,imshow(imadjust(mat2gray(h),'XData',t,'YData',r,'InitialMagnification','fit'),title('Hough变换矩阵');%显示Hough变换矩阵xlabel('theta'),ylabel('rho');axis on, axis

6、normal,hold on;P=houghpeaks(h,2);x=t(P(:,2);y=r(P(:,1);plot(x,y,'s','color','r'),title('');%获取并标出参数平面的峰值点lines=houghlines(bw,t,r,P,'FillGap',5,'Minlength',7);%检测图像中的直线段figure,imshow(gray);hold on;max_len=0;for i=1:length(lines) xy=lines(i).point1;lines

7、(i).point2; plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','g');%用绿色线段标注直线段 plot(xy(:,1),xy(1,2),'x','LineWidth',2,'Color','y'); plot(xy(:,1),xy(2,2),'x','LineWidth',2,'Color','r');%标注直线段端点endx=lines.theta;%由与图像边缘平行的

8、直线段的斜率得到整个图像旋转的角度B=imrotate(gray,x);%图像修正figure,imshow(B),title('旋转后图像');T=graythresh(B);%使用OTSU方法获得阀值Tresult=im2bw(B,T);%二值化图像figure,imshow(result),title('二值化后结果');%扫描区域:在本程序中,有7个扫描区域,分别对应题号为1-5,6-10,11-15,16-20,21-25,26-30,31-35这几个区域n=52;m=244;% 首先测得答题区域第一题A选项左上角的坐标(52,244)s=60;t=9

9、0;%s为上下两个扫描区域的距离,t为左右两个扫描区域的距离。P=4;Q=5;%P为字母项的个数(这里有ABCD共有4项),Q为每个小区域选项数。interval_length=14;%左右相邻两题填涂区域左边线的距离interval_width=9;%上下相邻两题填涂区域上边线的距离length=11;%填涂区域的长度width=6;%填涂区域的宽度a2=zeros(4,5);%初始化灰度值统计矩阵%第1-5题区域的检测for P=1:4 for Q=1:5 %m=244;n=52;%第1-5题区域的检测的起始坐标(即第一题A选项左上角的坐标) a1=result(m+(P-1)*(inte

10、rval_width+1) :m+(P-1)*(interval_width+1)+width,n+(Q-1)*(interval_length+1):n+(Q-1)*(interval_length+1)+length); %得到矩形区域内各像素的灰度值 sum1=sum(sum(a1);%计算统计的矩形区域内像素灰度值之和 a2(P,Q)=sum1;%多次循环后得到20个统计区域的灰度值,并依次放在a2矩阵中 endend a2(a2<80)=1;a2(a2>=81)=0;%对灰度值统计矩阵里的数值进行处理,大于某一阀值的值赋1,其余的赋0。 %在此程序中,涂黑则相应数值为1。

11、result1_5=a2;%存储1-5题的结果%第6-10题区域的检测for P=1:4 for Q=1:5 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); sum1=sum(sum(a1); a2(P,Q)=sum1; endend a2(a2<80)=1;a2(a2>=81)=0;result6_10=a2; %存储6-10题的结果%第11-

12、15题区域的检测for P=1:4 for Q=1:5 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); sum1=sum(sum(a1); a2(P,Q)=sum1; endend a2(a2<80)=1;a2(a2>=81)=0;result11_15=a2; %存储11-15题的结果%第16-20题区域的检测for P=1:4 for Q=1

13、:5 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); sum1=sum(sum(a1); a2(P,Q)=sum1; endend a2(a2<80)=1;a2(a2>=81)=0;result16_20=a2; %存储16-20题的结果%第21-25题区域的检测for P=1:4 for Q=1:5 a1=result(m+s*

14、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); sum1=sum(sum(a1); a2(P,Q)=sum1; endend a2(a2<80)=1;a2(a2>=81)=0;result21_25=a2; %存储21-25题的结果%第26-30题区域的检测for P=1:4 for Q=1:5 a1=result(m+s*3+(P-1)*(interval

15、_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); sum1=sum(sum(a1); a2(P,Q)=sum1; endend a2(a2<80)=1;a2(a2>=81)=0;result26_30=a2; %存储26-30题的结果%第31-35题区域的检测for P=1:4 for Q=1:5 a1=result(m+s*4+(P-1)*(interval_width+1) :m+s*4+

16、(P-1)*(interval_width+1)+width,n+t*1+(Q-1)*(interval_length+1):n+t*1+(Q-1)*(interval_length+1)+length); sum1=sum(sum(a1); a2(P,Q)=sum1; endend a2(a2<80)=1;a2(a2>=81)=0;result31_35=a2; %存储31-35题的结果answer=result1_5,result6_10,result11_15,result16_20,result21_25,result26_30,result31_35;%将所检测的7个区域

17、的结果汇总dlmwrite('Result.txt',answer);%以txt文本的形式输出结果矩阵disp(answer);%在command窗口实时显示结果%附加一个统计错误的并显示分数的部分,假定正确答案是35个CT=zeros(4,35);%初始化矩阵T(1,:)=1;%设定正确答案的参数mark1=answer-T;wrongx=sum(mark1=0);%当结果选错时,每一列将分别多一个1与-1。选择正确时,此列都是0。A=sum(sum(wrongx);%统计非零的结果。wrong=A/2;%由于-1与1是成对出现的,所以需要将上一步所得结果除以2.score=

18、35-wrong;%算出结果fprintf('选择题得分为%d',score);%在command窗口输出成绩四、模块测试与分析1、首先进行Hough变换,得到Hough变换矩阵如下所述(见图1)。图1可以观察到2个峰值。2、使用Houghlines函数检测直线,得到如下结果(见图2)图2并使用lines.theta语句得到直线角度,即为图像倾斜角度。x=lines.theta x =43、修正图像(如图3所示)图3这时观察到倾斜的图像已经得到改正。4、在二值化后使用像素检索技术对灰度值进行统计。分为7个扫描区域,如图4中7个方框所示。图45、进行灰度统计,得到结果矩阵。最后处理由fprintf语句得到分数。五、测试与调试过程这次实验遇到的第一个问题是如何由Hough变换得到直线角度。这个是教材上没有的。网上提示说是调用lines函数,但没有说怎么调用。后来才从一篇Hough变换的文章中知道是lines.theta,类似于C#的调用方法。还有就是在本次设计中我第一次是将旋转部分和灰度值统计部分分开写成2个m文件的,然后再直接合并,结果发现有误。经过检查后发现matlab在读取图片时会在原图片外加一圈白色“幕布”,导致原图片的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论