一、背景
随着现代教育考试的飞速发展,很多考试为了方便,减少阅卷的人工量都采用了答题卡来填涂答案。人们通过图像采集和计算机识别答题卡的方式计算出考生的成绩。
这次毕业设计主要研究的是利用 MATLAB 软件来实现对答题卡识别的系统。它采用光学的方法,通过扫描仪,获取答题卡的数字图像,然后通过 MATLAB 软件对图像数据进行分析和加工,其中主要包括了数字图像的预处理、图像内容的边缘检测、图像的平滑滤波、图像的直线检测、图像的修正、图像的分割和特征提取等内容。最后利用 MATLAB 中的工具箱,通过编程实现答题卡学号和答案的自动识别的系统。
通过MATLAB软件对扫描的答题卡图片进行识别并且计算分值,测试出的分值与真实的分值相对比,完全相同,测试结果说明这个识别系统是可行的。
二、研究内容
由于现在市场上的答题卡众多,而且不同公司的答题卡都要使用它们公司的阅卷系统。本文主要是研究利用 MATLAB 软件来实现用数字图像处理技术来识别标准答题卡。这个研究主要是针对如何识别答题卡以及如何编写软件系统设计。
课题的研究内容如下:
- 确定答题卡识别系统的整体方案,包括系统整体的框架以及硬件组成、软件开发方案,其中主要是软件方面的开发。
- 确定数字图像处理的算法,包括图像预处理、图像的倾斜级旋转校正、二
值变换等。通过分析和比较多种处理方法,结合图像本身的一些特点最后确定使用 Hough 变换来检测图像中的直线的倾角,并通过旋转图像使图像进行矫正。
- 研究了如何利用 MATLAB 软件对填涂答案区域的识别和对学号区域的识别,
准确有效的实现了对学号的提取和答案的提取,不论是多选还是单选。
- 利用 MATLAB 完成了系统的软件部分的编程设计,最主要的是实现了将答题卡中被填涂的答案提取出来,然后与标准的答案进行比对。通过相关的计算, 算出考生填涂正确的题数,并统计计算后的得分。
- 将统计的得分与实际的得分情况进行对比,并分析原因。
三、霍夫曼变换技术
Hough 变换法检测直线
Hough 变换是能够将检测出的边缘点连接起来得到边界曲线。那么我们在已经知道了这条曲线的形状之后,Hough 变换就是把这些十分分散的边缘点全部整合起来然后进行曲线逼近,我们也可以把这种变换看作是一种叫做聚类分析的技术。
Hough 变换可以使用两种方法检测直线,一种是利用直角坐标系,另一种是利用极坐标系。
- 利用直角坐标中的 Hough 变换检测直线
在一副图像空间中,经过(x, y)点的直线可以表示为:
y = ax + b (2.6)
其中 a 为斜率,b 为截距,上式可以变换为:
b = −xa + y (2.7)
这个变换就是直角坐标系中对(x, y)点的 Hough 变换。那么如何在 MATLAB 中实现 Hough 变换呢。首先在参数空间中需要建立一个二维累加数组M,数组的第一维的范围就是该直线斜率可能的大概范围,第二维的范围就是该直线截距可能大概的范围,并且在开始时要将数组 M 初始化。然后对于空间中的像素点依次用
Hough 变计算出 a 和 b 的值,而想对应的数组元素M(a, b)加 1,计算结束后, 这个M(a, b)的值就是图像在空间中落在斜率a 和截距 b 的直线上点的个数。
- 利用极坐标中的 Hough 变换检测直线
与直角坐标检测类似,在极坐标中也可以通过 Hough 变换将空间中的直线对应到空间中的点,对于空间中的一条直线,z 表示这条直线距离原点法线的距离,θ表示法线与X 轴的角度,所以该条直线的空间参数方程可以表示为:
z = x sin �� + �� cos �� (2.8)
其中(z,q )定义了一个从原点到线上最近点的向量,这个向量与该直线垂直。考虑一个以参数 z 和θ定义的二维空间。x,y 平面的任意直线对应了该空
间的一个点。因此,x,y 平面的任意直线的 Hough 变换是 z,θ空间的一个点。
现在考虑 x,y 平面的一个特定的点(x1,y1),过该点的直线可以有很多,每一条都对应z,θ空间中的一个点。然而这些点必须满足以 x1 和 y1 作为常量时的等式。因此在参数空间中与 x,y 空间中所有这些直线对应的点的轨迹是一条正
弦曲线,而x,y 平面上的任一点对应了z,θ空间的一条正弦曲线。
如果有一组位于由参数z0 ,qo 决定的直线上的边缘点,则每个边缘点对应了 (z, θ)空间的一条正弦曲线。所有这些曲线必交于点( z0 ,qo )。因为这是它们共享的一条直线的参数。
为了找出这些点所构成的直线段,我们需要建立一个在 z,θ空间的二维直方图,对于每一个边缘点(xi, yi),然后我们将对于该点 Hough 变换对应的 z,θ空间的直方图方格加一,当我们队所有边缘点执行完这样的操作后,包含( z0 ,qo )
的方格将会有局部的最大值。这样就可以检测出图像中的直线。检测出的图像边缘。
四、系统流程图
五、运行截图
六、核心代码
在MATLAB中,可以使用图像处理工具箱中的函数来进行答题卡识别。以下是一个简单的答题卡识别的步骤示例:
1. 读取答题卡图像:使用imread函数读取答题卡图像,将其存储为一个矩阵。
```matlab
image = imread('answer_sheet.jpg');
```
2. 灰度图像处理:将彩色图像转换为灰度图像,可以使用rgb2gray函数。
```matlab
gray_image = rgb2gray(image);
```
3. 图像二值化:将灰度图像转换为二值图像,可以使用imbinarize函数。
```matlab
bw_image = imbinarize(gray_image);
```
4. 边缘检测:通过检测图像的边缘,可以定位答题卡的轮廓,可以使用边缘检测函数如edge或者Canny边缘检测算法。
```matlab
edge_image = edge(bw_image);
```
5. 直线检测:使用Hough变换定位答题卡的直线,可以使用houghlines函数。
```matlab
lines = houghlines(edge_image);
```
6. 提取答题卡区域:根据答题卡的轮廓和直线信息,可以裁剪出答题卡的区域。
```matlab
answer_sheet_region = imcrop(image, [x, y, width, height]);
```
7. 答题卡区域划分:根据答题卡的答题区域的位置,可以将答题卡划分为多个小格子。
```matlab
answer_boxes = divide_answer_sheet(answer_sheet_region);
```
8. 识别填涂情况:对于每个小格子,可以使用OCR或者图像匹配算法来识别填涂情况。
```matlab
for i = 1:size(answer_boxes, 2)
filled = recognize_filling(answer_boxes(:, i));
fprintf('Question %d: %s\n', i, filled);
end
```