基于数字图像处理技术的答题卡识别方法
基于数字图像处理技术的答题卡识别方法
摘 要
背景:
随着科技的进步推动,在电子技术与计算机技术的基础上发展起来的答题卡系统极大地缓解了教师批改试卷所面临的巨大工作压力。该系统作为信息输入载体的功能模块集合,则是用于将所需信息转化为可供选择的答案选项的技术平台基础。答题卡则作为信息输入载体的功能模块集合,则是用于将所需信息转化为可供选择的答案选项的技术平台基础基础基础基础基础基础基础基础基础基础基础基础 basis basis basis basis basis basis basis basis basis basis. OMR系统通过光学扫描捕捉特定标记并将其转换为电信号的基础原理即在于此. 该研究利用数字图像处理中的像素统计方法进行识别. 研究者通过建立基于Hough变换的直线检测模型对图像倾斜情况进行判定. 该模型不仅能够有效判断图像是否存在倾斜现象,还能在此基础上实现倾斜角度精确计算. 在实际应用中,该算法能够根据检测结果自动完成图像旋转校正操作,从而实现对答题卡上涂写的答案区域精准定位与自动识别. 研究者采用基于灰度值累积分布的方法对二值化后的图像进行阈值判别,以此实现涂卡区域的有效识别. 由于这种方法依赖于大量计算资源且未考虑涂卡区域间的细微差异,导致误判率显著提高. 因此为了进一步提高识别效率,研究者提出了一种改进型累积直方图阈值算法.
关键词:Hough变换,答题卡识别,matlab,
一、设计任务、目的和要求
本研究采用MATLAB这一工具并结合数字图象处理技术对答题卡实施了精确识别并对采集数据进行了优化。在实际采集过程中由于光照角度、设备精度或其他环境因素可能导致答题卡出现倾斜、偏移或错位现象为了确保准确识别需先对其光学畸变进行校准随后利用像素匹配算法完成精确识别
二、总体方案设计
说明系统运行环境,编程软件平台,编码算法原理,算法流程图设计
该系统运行在当前主流的Windows7平台上,并采用最新的MATLAB 2012b版本作为设计工具。当处理旋转矫正时,首先通过Hough变换识别答题卡边缘直线,并调用lines函数获取倾斜角度;随后执行旋转变换以消除答题卡的倾斜状态。为了实现精确识别,在整个扫描过程中将整个图像划分为七个独立的部分,并分别采用像素定位技术计算每个区域内的灰度值累加结果;接着对累加结果进行阈值比较判断以完成颜色识别判断。最终将这些识别结果与标准答案对比以评估测试成绩
流程图:












是 是

否









三、程序设计
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变换
该段代码用于展示经过处理后的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选项左上角的坐标)
a₁ = returns(m + (P - ¹)(× interval_width+₁), m +(P-¹)(× interval_width+₁)+width; n +(Q-¹)(× interval_length+₁), n +(Q-¹)(× interval_length+₁)+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
a₁为计算结果等于 m 加上 s 乘以一再加上 (P 减一) 乘以 (区间宽度加一),并且从 m 加上 s 乘以一再加上 (P 减一) 乘以区间宽度加一起至宽度;n 加上 (Q 减一) 乘以 (区间长度加一),并且从 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
a1 is the result of m plus s multiplied by (P minus one) added to (the interval width plus one), and n plus t multiplied by (Q minus one) added to (the interval length plus one).
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
变量a₁被赋值为计算结果:m加上s乘以二再加上括号内(P减一)乘以括号外(interval width加一),整个部分的计算结果与另一部分的结果相等;该等式右边部分则由n加上t乘以一再加上(Q减去一)乘以括号外(interval 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
a₁等于输出结果,在输入参数中包含m加上s乘以三再加上(P减一)乘以(区间宽度加一),以及另一个参数n加上t乘以一再加上(Q减一)乘以(区间长度加一),这两个参数分别对应结果的第一个部分和第二个部分;然后在输出结果中加入宽度值到第一个部分,并在第二个部分加入长度值。
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_result = \left(m + s \times 4 + (P - 1) \times (\text{interval_width} + 1),\ m + s \times 4 + (P - 1) \times (\text{interval_width} + 1) + \text{width}\right);
n_result = \left(n + t \times 1 + (Q - 1) \times (\text{interval_length} + 1),\ n + t \times 1 + (Q - 1) \times (\text{interval_length} + 1) + \text{length}\right);
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=sum(mark1~=0);%当计算错误时,在各列中分别增加+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
这时观察到倾斜的图像已经得到改正。
经过二值化处理后采用像素检索技术统计各区域的灰度特征。将图像划分为七个独立的扫描区块,并参考图4中的七个方框进行分析。

图4
5、进行灰度统计,得到结果矩阵。最后处理由fprintf语句得到分数。
五、测试与调试过程
在本次实验过程中遇到的第一个挑战是如何通过Hough变换获取直线的角度信息。这一问题并未在教材中有所提及。网上的一些提示指出应调用lines函数,并建议采用类似于C#的方法进行操作。然而,在实际操作过程中仍存在问题需要解决:同时,在本次设计过程中第一次尝试将旋转操作与灰度值统计模块分别编写为两个独立的MATLAB脚本文件,并随后直接将其整合在一起使用。然而,在实际运行过程中发现存在一定的问题:经过进一步检查发现问题所在:在处理图像时会自动添加一圈白色背景(often referred to as a '幕布'),这会导致原始图像的实际尺寸发生变化(specifically, the original image's width and height are altered)。因此最终仍需对相关参数进行调整以确保实验顺利进行
六、结果与心得体会
在扫描矩阵中,请特别关注其中数值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这一工具实现了答题卡填涂区域的有效识别,并具有一定的实用价值。该门课程是一门实践性很强的专业课,在本次课程设计中对图像处理的基本思路有了基本的认识。在这次设计中最大的收获是任何事情都必须苦心钻研并积极查找资料;掌握现有电气设备的原理及实际操作与维修;积极协调配电工的工作;出现事故时无条件迅速返回机房听从领班的指挥;负责执行管辖设备的检修计划按时按质按量完成并认真填写记录表格;严格执行设备管理制度做好overnight班接值工作;当值结束前发生故障需等待下一班共同处理不可擅自离开岗位当配电设备发生事故不得擅自离开岗位请假或补休需提前一天向领班汇报。
