基于数字图像处理技术的答题卡识别方法图像处理课程练习文档格式.docx
《基于数字图像处理技术的答题卡识别方法图像处理课程练习文档格式.docx》由会员分享,可在线阅读,更多相关《基于数字图像处理技术的答题卡识别方法图像处理课程练习文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
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'
axison,axisnormal,holdon;
P=houghpeaks(h,2);
x=t(P(:
2));
y=r(P(:
1));
plot(x,y,'
s'
color'
r'
'
%获取并标出参数平面的峰值点
lines=houghlines(bw,t,r,P,'
FillGap'
5,'
Minlength'
7);
%检测图像中的直线段
figure,imshow(gray);
holdon;
max_len=0;
fori=1:
length(lines)
xy=[lines(i).point1;
lines(i).point2];
plot(xy(:
1),xy(:
2),'
LineWidth'
2,'
Color'
g'
%用绿色线段标注直线段
1),xy(1,2),'
x'
y'
1),xy(2,2),'
%标注直线段端点
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);
%初始化灰度值统计矩阵
%第1-5题区域的检测
forP=1:
4
forQ=1:
5
%m=244;
%第1-5题区域的检测的起始坐标(即第一题A选项左上角的坐标)
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题区域的检测
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):
result6_10=a2;
%存储6-10题的结果
%第11-15题区域的检测
m+(P-1)*(interval_width+1)+width,n+t*1+(Q-1)*(interval_length+1):
n+t*1+(Q-1)*(interval_length+1)+length);
result11_15=a2;
%存储11-15题的结果
%第16-20题区域的检测
m+s*1+(P-1)*(interval_width+1)+width,n+t*1+(Q-1)*(interval_length+1):
result16_20=a2;
%存储16-20题的结果
%第21-25题区域的检测
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):
result21_25=a2;
%存储21-25题的结果
%第26-30题区域的检测
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):
result26_30=a2;
%存储26-30题的结果
%第31-35题区域的检测
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):
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.thetax=4
3、修正图像(如图3所示)
图3
这时观察到倾斜的图像已经得到改正。
4、在二值化后使用像素检索技术对灰度值进行统计。
分为7个扫描区域,如图4中7个方框所示。
图4
5、进行灰度统计,得到结果矩阵。
最后处理由fprintf语句得到分数。
五、测试与调试过程
这次实验遇到的第一个问题是如何由Hough变换得到直线角度。
这个是教材上没有的。
网上提示说是调用lines函数,但没有说怎么调用。
后来才从一篇Hough变换的文章中知道是lines.theta,类似于C#的调用方法。
还有就是在本次设计中我第一次是将旋转部分和灰度值统计部分分开写成2个m文件的,然后再直接合并,结果发现有误。
经过检查后发现matlab在读取图片时会在原图片外加一圈白色“幕布”,导致原图片的长与宽发生变化,使原图片中的坐标也发生变化。
因此最后还得重新修改相关参数。
六、结果与心得体会
扫描矩阵为,注意观察其中1出现的位置,和答题卡中填涂区域完全一致,所以可知此方法成功的进行地对答题卡进行了识别。
Columns1through9
100000000
000011011
001100100
010000000
Columns10through18
000010101
101101010
000000000
Columns19through27
000000010
001100001
100010100
010001000
Columns28through35
00010000
01101000
10000001
00000110
输出结果为得分为4分,与预期值也相符(假定正确答案是35个A)
本论文使用图像处理技术以MATLAB为工具成功实现了对答题卡填涂区域的识别,具有一定的实用价值。
图像处理课程是一门实践性很强的课程,通过这次课程设计我对图像处理的基本思路有了基本的认识。
在这次设计中,我的最大收获是做任何东西都必须苦心钻研,积极查找资料。