基于MATLAB数字图像处理技术的答题卡识别方法

基于MATLAB数字图像处理技术的答题卡识别⽅法
吸收二氧化硫
基于数字图像处理技术的答题卡识别⽅法
摘 要
背景:
随着科技的发展,电⼦与计算机技术的进步,答题卡的出现⼤⼤减轻教学⼯作者们批改试卷的⼯作量。答题卡是光标阅读机输⼊信息的载体,是配套光标阅读机的各种信息录⼊表格的总称。 答题卡将⽤户需要的信息转化为可选择的选项,供⽤户涂写。OMR是⽤扫描的⽅法来识别按⼀定格式印刷或书写的标记,并将其转换为计算机能接受的的设备,并根据信息点的涂与未涂和格式⽂件设置将信息还原。因此,如何将答题卡填涂的⿊⾊区域识别出来并使⽤计算机进⾏处理是极为关键的。本论⽂探索了有效识别答题卡的⽅法,以matlab为⼯具,基于数字图像处理技术对答题卡填涂区域进⾏了识别,并对识别的结果进⾏了处理,得到了结果。本论⽂利⽤Hough变换的直线检测技术检测图像的倾斜度,判断图像是否倾斜,对存在倾斜的图像进⾏旋转校正。最终实现答题卡答案的定位和检测。论⽂使⽤像素统计⽅法进⾏识别,利⽤⿊⽩颜⾊灰度值的巨⼤差异对⼆值图像的灰度值进⾏累加并进⾏阈值判定,识别错误效率极低,能够准确的识别答题卡的涂卡标记。
关键词:Hough变换,答题卡识别,matlab,
用电信息采集
⼀、设计任务、⽬的和要求
本设计以matlab为⼯具利⽤数字图像处理技术对答题卡进⾏了识别,并对识别结果进⾏了处理。注意到答题卡在采集图像的过程中由于各种原因可能会产⽣图像倾斜、⽔平或垂直错位,要进⾏正确识别⾸先必须对其进⾏校正,再依据像素检索技术进⾏识别。
⼆、总体⽅案设计
说明系统运⾏环境,编程软件平台,编码算法原理,算法流程图设计
本系统运⾏在当今主流的Windows7系统,使⽤较新的MATLAB2012b进⾏设计。在进⾏旋转校正时,先使⽤Hough变换检测出答题卡边缘直线,调⽤lines函数的参数得到倾斜⾓度并进⾏旋转变换从⽽消除答题卡倾斜状态。将扫描部分分为7个扫描区域,分别使⽤像素检索技术,对各个检索区域内的灰度值进⾏累加,并对累加和进⾏阈值判定,从⽽得出检索区域颜⾊,完成判定。最后再与标准答案进⾏⽐对,得出成绩。
流程图:
开始
图像旋转
图像倾斜吗?
是 是
分别依次统计各⼤扫描区域内各个检测区域的灰度值
阈值判定,得出所检测区域颜⾊并赋值
与标准答案⽐对算出成绩
结束
三、程序设计
clc;clear;close;
A=imread('原图.jpg');%读取图像
imshow(A),title('原图');
gray=rgb2gray(A);
bw=edge(gray,'canny');%canny算⼦边缘检测得到⼆值边缘图像
[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 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(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');%标注直线段端点
end
x=lines.theta;%由与图像边缘平⾏的直线段的斜率得到整个图像旋转的⾓度
B=imrotate(gray,x);%图像修正
figure,imshow(B),title('旋转后图像');
T=graythresh(B);%使⽤OTSU⽅法获得阀值T
result=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=90;%s为上下两个扫描区域的距离,t为左右两个扫描区域的距离。
P=4;Q=5;%P为字母项的个数(这⾥有ABCD共有4项),Q为每个⼩区域选项数。
interval_length=14;%左右相邻两题填涂区域左边线的距离
interval_width=9;%上下相邻两题填涂区域上边线的距离
length=11;%填涂区域的长度
width=6;%填涂区域的宽度
a2=zeros(4,5);%初始化灰度值统计矩阵
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);
%得到矩形区域内各像素的灰度值
sum1=sum(sum(a1));%计算统计的矩形区域内像素灰度值之和
a2(P,Q)=sum1;%多次循环后得到20个统计区域的灰度值,并依次放在a2矩阵中
end
end
a2(a2<80)=1;
a2(a2>=81)=0;%对灰度值统计矩阵⾥的数值进⾏处理,⼤于某⼀阀值的值赋1,其余的赋0。
%在此程序中,涂⿊则相应数值为1。
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;
end
end
a2(a2<80)=1;
result6_10=a2; %存储6-10题的结果
%第11-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;
end
end
a2(a2<80)=1;
a2(a2>=81)=0;
result11_15=a2; %存储11-15题的结果
%第16-20题区域的检测
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+t*1+(Q-1)*(interval_length+1):n+t*1+(Q-1)*(interval_length+1)+length);        sum1=sum(sum(a1));
a2(P,Q)=sum1;
end
end
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*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;
end
end泥沙过滤器
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_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;
end
end
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+(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));
end
end
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个区域的结果汇总dlmwrite('',answer);%以txt⽂本的形式输出结果矩阵
disp(answer);%在command窗⼝实时显⽰结果
%附加⼀个统计错误的并显⽰分数的部分,假定正确答案是35个C
T=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=35-wrong;%算出结果
fprintf('选择题得分为%d',score);%在command窗⼝输出成绩
四、模块测试与分析
1、⾸先进⾏Hough变换,得到Hough变换矩阵如下所述(见图1)。
图1
可以观察到2个峰值。
2、使⽤Houghlines函数检测直线,得到如下结果(见图2)
图2
并使⽤lines.theta语句得到直线⾓度,即为图像倾斜⾓度。
x=lines.theta x =4
3、修正图像(如图3所⽰)
图3
这时观察到倾斜的图像已经得到改正。
4、在⼆值化后使⽤像素检索技术对灰度值进⾏统计。分为7个扫描区域,如图4中7个⽅框所⽰。
图4
5、进⾏灰度统计,得到结果矩阵。最后处理由fprintf语句得到分数。
五、测试与调试过程
这次实验遇到的第⼀个问题是如何由Hough变换得到直线⾓度。这个是教材上没有的。⽹上提⽰说是调⽤lines函数,但没有说怎么调⽤。后来才从⼀篇Hough变换的⽂章中知道是lines.theta,类似于C#的调⽤⽅法。还有就是在本次设计中我第⼀次是将旋转部分和灰度值统计部分分开写成2个m⽂件的,然后再直接合并,结果发现有误。经过检查后发现matlab在读取图⽚时会在原图⽚外加⼀圈⽩⾊“幕布”,导致原图⽚的长与宽发⽣变化,使原图⽚中的坐标也发⽣变化。因此最后还得重新修改相关参数。
六、结果与⼼得体会
扫描矩阵为,注意观察其中1出现的位置,和答题卡中填涂区域完全⼀致,所以可知此⽅法成功的进⾏地对答题卡进⾏了识别。
Columns 1 through 9
1 0 0 0 0 0 0 0 0
0 0 0 0 1 1 0 1 1
0 0 1 1 0 0 1 0 0
0 1 0 0 0 0 0 0 0
Columns 10 through 18
0 1 0 0 0 0 0 0 0
0 0 0 0 1 0 1 0 1
1 0 1 1 0 1 0 1 0
0 0 0 0 0 0 0 0 0
Columns 19 through 27
0 0 0 0 0 0 0 1 0

本文发布于:2024-09-22 11:35:04,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/294278.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:区域   答题卡   图像   得到   检测   识别   结果
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议