基于数字图像处理技术的答题卡识别
基于数字图像处理技术的答题卡识别方法
摘 要
背景:
随着科技的进步,电子技术与计算机技术的快速发展,答题卡作为一项重要的工具,在教育领域发挥着越来越重要的作用。它不仅能够显著降低教学工作者批改试卷的工作负担,还成为现代教育评估体系中不可或缺的一部分。答题卡是一种高效的信息传递工具,它是基于光标阅读机的技术基础构建起来的整体信息记录系统,涵盖了多种功能模块和技术支撑。这种载体通过将用户所需的信息转化为可供选择的答案选项,实现了标准化评估的目标。在这一系统中,OMR技术扮演着关键角色:它采用光学扫描手段识别印刷或书写的特定标记符号,并将这些信号转换为计算机能够处理的形式,从而实现对填涂图像的角度检测与校正功能。通过这一系列精确的操作流程,OMR系统最终能够准确地定位并解析答题卡上的涂鸦区域,从而完成评估任务的核心功能。在本研究中,我们利用MATLAB平台结合数字图像处理算法,开发了一种高效的答题卡识别系统:通过像素统计方法完成识别过程的同时结合Hough变换算法进行倾斜校正操作;利用灰度值累积法设定合理的阈值判定标准;最终实现了对试题答案位置的有效定位及准确提取机制
关键词:Hough变换,答题卡识别,matlab,
一、设计任务、目的和要求
本设计采用了matlab这一工具,并借助数字图像处理技术完成了答题卡的识别及结果的后续处理。考虑到在采集图像的过程中可能会因各种因素而导致出现图像倾斜、水平偏移或垂直偏移的情况,在进行正确识别之前必须先采取措施对出现的倾斜、水平或垂直错位进行校正。再应用像素检索技术来进行进一步的识别工作。
二、总体方案设计
说明系统运行环境,编程软件平台,编码算法原理,算法流程图设计
本系统基于主流Windows7平台运行
流程图:












是 是

否









三、程序设计
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('旋转后图像');
%扫描区域:在本程序中,有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);%初始化灰度值统计矩阵
%第1-5题区域的检测
for P=1:4
for Q=1:5
%m=244;n=52;%第1-5题区域的检测的起始坐标(即第一题A选项左上角的坐标)
计算结果等于 m 加上 (P 减一乘以间隔宽度加一),一直到 m 加上同样的表达式再加宽度;以及 n 加上 (Q 减一乘以间隔长度加一),一直到 n 加同样的表达式再加长度。
%得到矩形区域内各像素的灰度值
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
a₁等于m加上s的一次方再加上(P减一)乘以(区间宽度加一),并且又等于n加上(Q减一)乘以(区间长度加一),同时结果还被限定在宽度和长度范围内
sum1=sum(sum(a1));
a2(P,Q)=sum1;
end
end
a2(a2<80)=1;
a2(a2>=81)=0;
result6_10=a2; %存储6-10题的结果
%第11-15题区域的检测
for P=1:4
for Q=1:5
a2(a2<80)=1;
a2(a2>=81)=0;
result11_15=a2; %存储11-15题的结果
%第16-20题区域的检测
for P=1:4
for Q=1:5
a₁ 是由两个区间组成的结果计算得出的位置参数;第一个区间位于 m+s×₁+(P−₁)×(间隔宽度+₁),直到 m+s×₁+(P−₁)×(间隔宽度+₁)+width;第二个区间位于 n+t×₁+(Q−₁)×(间隔长度+₂),直到 n+t×₁+(Q−₁)×(间隔长度+₂)+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+s2+(P-1)(interval_width+1) :m+s2+(P-1)(interval_width+1)+width,n+t1+(Q-1)(interval_length+1):n+t1+(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
该值由以下两部分组成:
第一部分为 m 加上 s 的三倍以及 (P−1) 乘以 (\text{interval\_width}+1),
第二部分则为 n 加上 t 以及 (Q−1) 乘以 (\text{interval\_length}+2)。
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
a₁ equals result of m plus s multiplied by four, added to the product of (P minus one) and (the sum of interval width and one), and similarly for n, t, Q, interval length, and length.
sum1=sum(sum(a1));
a2(P,Q)=sum1;
end
end
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个区域的结果汇总
dlmwrite('Result.txt',answer);%以txt文本的形式输出结果矩阵
disp(answer);%在command窗口实时显示结果
%附加一个统计错误的并显示分数的部分,假定正确答案是35个C
T=zeros(4,35);%初始化矩阵
T(1,:)=1;%设定正确答案的参数
mark1=answer-T;
该错误变量的计算公式为:wrongx等于mark1不等于零矩阵的求和运算的结果;当选结果出现错误时,该列将分别增加1和-1;当选结果正确时,则该列值均为零
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
这时观察到倾斜的图像已经得到改正。
After performing binarization, the system employs a pixel-based search technology to calculate the gray-level distribution. The analysis is segmented into seven distinct scanning zones, as illustrated in Figure 4 with its seven outlined boxes.

图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
0 0 1 1 0 0 0 0 1
1 0 0 0 1 0 1 0 0
0 1 0 0 0 1 0 0 0
Columns 28 through 35
0 0 0 1 0 0 0 0
0 1 1 0 1 0 0 0
1 0 0 0 0 0 0 1
0 0 0 0 0 1 1 0
输出结果为得分为4分,与预期值也相符(假定正确答案是35个A)
本研究应用图像处理技术借助MATLAB工具获得答题卡填涂区域识别的有效方案,并展现了其应用潜力。该课程实践性强。在本次课程设计中对图像处理的基本思路有了初步认识。最大的收获是任何事情都需要深入研究并主动获取信息;3) 掌握现有电气设备原理及操作维护技能;4) 审批并执行管辖设备检修计划,并做好记录;5) 严格遵守设备管理制度;6) 在出现故障时需协同下一班完成排故工作且不得擅自离岗;7) 请假补休需提前报告领班并由领班安排合适替班人
