基于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('旋转后图像');
%扫描区域:在本程序中,有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选项左上角的坐标)
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;
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题的结果
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题的结果
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。选择正确时,此列都是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
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为工具成功实现了对答题卡填涂区域的识别,具有一定的实用价值。图像处理课程是一门实践性很强的课程,通过这次课程设计我对图像处理的基本思路有了基本的认识。
基于MATLAB的答题卡识别方法相关推荐
- 基于MATLAB的答题卡识别软件设计
基于 MATLAB 的答题卡识别软件设计 课题意义 随着教育技术的飞速发展,考试普遍使用答题卡来记录答案,采用计算机自动识别答案卡信息,计算考生的成绩,可以减少阅卷人的工作量.本文利用 Matlab ...
- 毕业设计之 ---基于机器视觉的答题卡识别
简介 今天我们来介绍一个与机器视觉相关的毕业设计 基于机器视觉的答题卡识别系统 多说一句, 现在越来越多的学校以及导师选题偏向于算法类, 这几年往往做web系统的同学很难通过答辩, 仔细一想这也在情理 ...
- 基于 Java 的答题卡识别系统
这张答题卡想必伴随了大家的学生时代,不管是中考.高考.考研,都会用 2B 铅笔涂好卡上的红框框. 今天推荐一个基于 Spring MVC + OpenCV 的答题卡识别系统,OpenCV 是一个计算机 ...
- 基于EmguCv圆形答题卡识别的优化
主要对答题卡通用性方面进行了优化(可不限于5*5的答题卡,对图片规格进行统一,可自动计算轮廓间距),并对一些容易出现的bug进行了修复.还需要手动控制统一后的图片大小规格及测量需要检测到的轮廓大小范围 ...
- 【答题卡识别】基于hough变换答题卡判定与成绩统计含Matlab源码
1 简介 目前,考试阅卷使用光标阅读机进行阅卷.而教师个人及普通学校则难以承担光标阅读机高昂的购买与维护费用.如何保证计算机视觉相关技术在教育教学领域被充分应用,使教师个人,普通学校以及偏远山区的学校 ...
- 基于MATLAB答题卡识别(GUI,论文)
本课题为基于MATLAB的不变矩答题卡识别.可识别学号,学科,答案,并进行分数统计,以及判断是否及格.后台可设置标准excel答案.经过灰度变换形成灰度图像.二值化处理.图像滤波.边缘检测.hough ...
- 【答题卡识别】Hough变换答题卡识别【含Matlab源码 250期】
⛄一.获取代码方式 获取代码方式Q: 完整代码已上传我的资源:[答题卡识别]基于matlab Hough变换答题卡识别[含Matlab源码 250期] 获取代码方式2: 付费专栏图像处理(Matlab ...
- 基于Android和OpenCV的答题卡识别软件
基于Android和OpenCV的答题卡识别软件 1. 软件介绍 设计目标是可以添加不同的考试,在不同考试下可以设置模板,包括题目数量.答题卡样式.每题分值以及每题答案:扫描结果按列表显示,并讲识别出 ...
- 【Matlab答题卡识别】hough变换答题卡判定与成绩统计【含GUI源码 752期】
一.代码运行视频(哔哩哔哩) [Matlab答题卡识别]hough变换答题卡判定与成绩统计[含GUI源码 752期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [ ...
最新文章
- 普渡大学计算机硕士申请条件,普渡大学计算机与信息技术理学硕士研究生申请要求及申请材料要求清单...
- 传热学c语言节点编程题_哈工大苏小红C语言编程题目第二周的答案第一二题12...
- 开源数据库该怎么玩?
- 机器学习算法加强——聚类
- C++实用技巧(三)
- 分布式计算平台:Dryad
- 数据结构34:二叉树前序遍历、中序遍历和后序遍历
- linux循环条件,shell脚本编写 之 条件选择,条件判断,循环语句
- 【转载】ESFramewor使用技巧(2)-- 在插件中使用NHibernate
- 不敢相信!美国预测10年后的世界!
- HMM隐马尔科夫模型浅析
- 10天确定Python,运行环境(超详细步骤)
- oracle log.xml分析,Oracle 11g Alert Log日志位置及参数
- 产品配件类目税目分类_商品和服务税收分类编码表
- spark submit提交方式
- 什么是CSR ? 什么是公钥和私钥?
- 《Plants Vs Zombies(植物大战僵尸)》游戏存档修改
- [补充]上集 Ch. 19-12(AJAX)在ListView / GridView的「样版」里面,放置 UpdatePanel
- beeline客户端连接hiveserver2问题
- 输入a,b,c三个整数求其中最大值(C语言实现)
热门文章
- 全网最细,实测可用!Iconfont阿里巴巴矢量库的使用,将icon图标引入前端页面
- 使用Python创建词云
- spark3.0 分布式集群搭建
- python爬虫豆瓣读书top250+数据清洗+数据库+Java后端开发+Echarts数据可视化(二)
- Epson针式打印机切纸/存折灯常亮一页打印造成多页的解决方案
- 桌面读卡器模拟光标输出文档
- 矩形脉冲信号的频域分析_信号的时频域分析与窗函数作用
- ubuntu 上 ESP8266 HomeKit 实战(五)2路继电器
- A Blog of WEB
- 使用iPerf测试网络吞吐量