小言_互联网的博客

终于不用手撸了,解放你的双手,教你用数学建模的方式对答题卡进行有效识别

420人阅读  评论(0)

前言

声明:后期原力计划活动期间的数学建模类文章都会转入MATLAB深入理解高级教程(附源码)专栏。对于理工科类及马上要毕业设计的小伙伴应该会有很大帮助,有需要的小伙伴赶紧订阅吧。包括AI系列博文,博主后续会不断更新该领域的知识。人工智能AI实战系列代码全解析

本文介绍如何采用MATLAB进行答题卡识别,属于图像处理的应用领域。在这之前我们我们需要普及下基于hough变换的直线检测知识,具体可参见链接给出的博文。

对应的源代码详见:

matlab源码集锦-图像处理-用数学建模的方式对答题卡进行有效识别

1 答题卡读取

 

现有答题卡扫描图像,如下图所示。

MATLAB中采用imread函数读取图像。


  
  1. p_name =  "答题卡.jpg" ;
  2. A=imread(p_name) ;

2 答题卡倾角检测

考虑有些答题卡有一定的旋转角度,因此需要利用hough变换原理进行直线检测。首先,将读取的答题卡图像转化为灰度图像(rgb2gray),其次,采用canny算子进行边缘检测(edge),最后基于Hough变换进行直线检测并计算出倾斜角度(hough)。


  
  1. gray=rgb2gray(A);
  2. bw=edge(gray, 'canny');
  3. [h,t,r]=hough(bw, 'RhoResolution', 0.5, 'ThetaResolution', 0.5);
  4. P=houghpeaks(h, 2);
  5. lines=houghlines(bw,t,r,P, 'FillGap', 50, 'Minlength', 7);
  6. imshow(gray);
  7. hold on;
  8. max_len= 0;
  9. for i= 1:length( lines)
  10.     xy=[ lines(i).point1; lines(i).point2];
  11.     plot(xy(:, 1),xy(:, 2), 'LineWidth', 2, 'Color', 'g');
  12.     plot(xy(:, 1),xy( 1, 2), 'x', 'LineWidth', 2, 'Color', 'y');
  13.     plot(xy(:, 1),xy( 2, 2), 'x', 'LineWidth', 2, 'Color', 'r');
  14. end
  15. x= lines.theta;

 

 

倾角检测

3 答题卡位置校正

上节中答题卡检测的倾角计算为,将图像旋转-x角度(imrotate)


  
  1. B=imrotate( gray,x) ;
  2. imshow( B) ;

 

 

答题卡位置校正

4 答题卡二值化

图像的二值化处理就是将图像上的点的灰度值为0或255,也就是将整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阈值选取而获得仍然可以反映图像整体和局部特征的二值化图像。

在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的。

二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,方便对图像做进一步处理时,图像的集合性质只与像素值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小,MATLAB中采用im2bw函数。


  
  1. T=graythresh(B) ;
  2. result=im2bw(B,T) ;

 

答题卡二值化

5 答题卡答案识别

核心思想就是利用图像的像素位置找到每个选择题,再通过ABCD答案像素位置的阈值进行判定所选的答案。首先测得答题区域第一题A选项左上角的坐标,分别确定上下两个扫描区域的距离,左右两个扫描区域的距离,上下相邻填涂区域上边线的距离、填涂区域的长度、填涂区域的宽度,  对灰度值统计矩阵里的数值进行处理,大于某一阀值的值赋1,其余的赋0。


  
  1. n= 135;m= 615;% 首先测得答题区域第一题A选项左上角的坐标( 52, 244
  2. s= 60;t= 55;
  3. interval_length= 30;
  4. interval_width= 10;
  5. length= 10;
  6. width= 15;
  7. a2=zeros( 4, 1);
  8. t1= 0;
  9. for D= 1: 2
  10.      for S= 1: 5
  11.          if D== 1&&(S== 3||S== 4||S== 5)
  12.          else
  13.              t1=t 1+ 1;
  14.              for P= 1: 5
  15.                  for Q= 1: 4
  16.                      m1=m+(Q- 1)*(width+interval_width)+(S- 1)*(s+( 4*width+ 3*interval_width));
  17.                      m2=m 1+width;
  18.                      n1=n+(P- 1)*(length+interval_length)+(D- 1)*(t+( 5*length+ 4*interval_length));
  19.                      n2=n 1+length;
  20.                      al=result(m 1:m 2,n 1:n 2);
  21.                      a2(Q)=sum(sum(al));
  22.                  end
  23.                  switch find(a 2< 110)
  24.                      case  1
  25.                          jieguo{t 1,P}='A';
  26.                      case  2
  27.                          jieguo{t 1,P}='B';
  28.                      case  3
  29.                          jieguo{t 1,P}='C';
  30.                      case  4
  31.                          jieguo{t 1,P}='D';
  32.                  end
  33.              end
  34.          end
  35.      end
  36. end

 

答题卡识别结果

 


转载:https://blog.csdn.net/wenyusuran/article/details/113241159
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场