基于数字图像处理技术的答题卡识别方法
基于数字图像处理技术的答题卡识别方法
一、课题背景
随着科技的发展,电子与计算机技术的进步,答题卡作为重要工具出现后,极大地减少了教师批改试卷的时间成本。答题卡可被视为光标输入设备的信息存储工具,整合了配套系统的多维度数据记录表格。通过转录功能,答题卡能够将用户提供的信息转换为可供选择的形式,方便考生进行标记。OMR系统利用光学扫描的方法捕捉印刷或书写的标记信息,将其转换为计算机能识别的电信号形式;根据特定格式文件设置识别涂画区域并还原原始信息内容。为了实现精准识别目标,Otto等学者提出采用Hough变换检测图像倾斜度的技术方案:通过检测图像倾斜情况判断是否存在旋转偏移;若存在倾斜则需对图像进行旋转校正处理;最终完成试题答案位置确定及自动识别功能开发工作流程。研究团队基于Matlab软件平台开展数字图像处理实验:首先建立二值化灰度矩阵模型;随后利用像素累加阈值方法提取目标区域特征;最后通过对比实验验证了该算法在不同光照条件下的鲁棒性表现效果显著
- 算法思路
说明系统环境,编程软件平台,编码算法原理,算法流程图设计
基于当前主流的Windows 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(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;
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₁等于函数作用于m加上(P减一乘以区间宽度加一),直到m加上(P减一乘以区间宽度加一)再加上宽度;以及n加上(Q减一乘以区间长度加一),直到n加上(Q减一乘以区间长度加一)再加上长度
%得到矩形区域内各像素的灰度值
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
%第16-20题区域的检测
for P=1:4
for Q=1:5
a₁=计算结果等于m+s×₁ + (P−₁)×(区间宽度+₁),至m+s×₁ + (P−₁)×(区间宽度+₁)+宽度;n+t×₁ + (Q−₁)×(区间长度+₁),至n+t×₁ + (Q−₁)×(区间长度+₁)+长度;
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
a₁ is the value of the expression that begins with m, adds s multiplied by 3, then adds (P - 1) multiplied by (interval width + 1). This is followed by m again, adding s × 3, then adding (P - 1) × (interval width + 1). The first part ends with a colon and a space. Then comes n + t × 2, subtracts one from Q and multiplies it by (interval length + 2), resulting in n + t ×2 − Q. Finally, this is followed by another colon and space before ending with 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题区域的检测
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所示)。

图4
5、进行灰度统计,得到结果矩阵。最后处理由fprintf语句得到分数。
