1. 案例背景
随着信息化技术的发展,计算机几乎已经融入了人们工作、学习的方方面面,在答 题卡阅卷领域使用计算机取代人工阅卷已成为形式所趋。计算机阅卷既使教育工作者省 心、省力,减少了人为错误发生的几率,使考试更加公平,也减少了阅卷时间,提高了 阅卷效率和质量。
通过计算机对学生答题卡进行识别,还可以直接将学生的成绩存储到 计算机中,通过数据库对其进高效管理,省去了手工输入学生成绩建立数据库的工序, 且便于长久保存。因此,学生答题卡图像识别技术能够方便地获取答题成绩,进而将其 应用到不同的教研系统中进行数据共享,还可以和许多信息化技术相结合,具有非常重 要的意义。
本案例研究答题卡识别软件的设计与开发,集成了图像分割、模式识别等领域的功 能模块,涉及计算机图像处理的- - 系列知识。通过图像处理技术,系统能够识别答题卡 图像的答案选项,再通过输入正确答案的答题卡并与之对照,进而对学生答题卡进行判 别并计算出分数。本案例侧重于图像识别方面的实现,应用了图像校正、模式识别等方 面的算法。
2. 理论基础
答题卡自动阅卷系统通过获取答题卡图像作为系统输入,并通过计算机处理、自动识 别填涂标记,存入数据库完成阅卷。在图像数字化的过程中,受设备、环境等因素的影响, 答题卡图像的质量在- -定程度上下降,影响自动阅卷的准确率,甚至导致无法正常阅卷。 因此,要对所获取的图像进行-系列的预处理,滤去干扰、噪声,做几何校正、彩色校正 等操作,并进行二值化处理,以确保后续步骤能顺利进行。
2.1 图像二值化
彩色图像经过灰度化处理后得到灰度图,每个像素都仅有一一个灰度值, 该灰度值的大 小决定了像素的亮暗程度。在答题卡自动识别实验中,根据答题卡图像答案目标的色彩特 点,为了方便地进行目标答案的检测和识别,我们需要对灰度图像进行二值化处理,也就 是说各像素的灰度值只有0和1两个取值,用来表示黑白两种颜色,这样可以大大减少计 算的数据量"。
在对答题卡图像进行二值化的过程中,阈值的选取是关键,直接影响到目标答案是否 能被正确识别。根据二值化过程中的阈值选取的来源不同,阈值选取方法可以分为全局和 局部两种。
鉴于答题卡图像的应用场景,不同考生填涂答题卡的深浅度往往不同。如果采 用由用户指定阈值的方法,则可能会产生对每张答题卡都需要进行阈值调整的要求,而且 在光照不均匀等因素的影响下往往会出现目标区域二值化异常的现象。因此,在本案例中 采用局部平均阈值法来自动确定阈值,当像素点的灰度值小于阈值时,则将该点的数值置 为0,否则将数值置为1。该算法在不同的图像区域所选择的阈值会自动调整,也消除了光 照不均匀等因索的干扰,同时在光照明暗变化时能自动调整阈值的大小。
2.2 图像矫正
在答题卡图像采集的过程中,由于种种原因,可能会导致所采集得到的答题卡图像有 某种程度的倾斜,为了得到准确的阅卷结果,需要进行必要的倾斜纠正处理。答题卡图像 的倾斜校正一般分为两步:第-步,查找倾斜角度;第二步,进行坐标变换,得到校正后 的图像。其中,常用的倾斜角度查找方法有两种:--种是利用Hough变换来找出倾斜角度; 另一种是利用角点检测来找出倾斜角度。根据答题卡图像样式固定的特点,本案例采用 Hough变换来进行倾斜角度的计算。
Hough变换作为一种参数空间变换算法,自从1962年被Hough提出之后,便成为直 线和其他参数化形状检测的重要工具。
Hough变换具有较强的稳定性和鲁棒性,可以在一 定程度上避免噪声的影响,而且易于并行运算[2]。因此,Hough 变换被不断地研究并取得 大量进展,Duda 和Halt将极坐标引入Hough变换,使这种方法可以更加有效地用于直线 检测和其他任意几何形状的检测。Ballard提出了非解析任意形状的R表法,将Hough变 换推广到对任意方向和范围的非解析任意形状的识别,这种方法被称为广义Hough变换。
2.3 图像分割
图像分割是图像处理中常用的关键步骤之--,本案例涉及对答题卡图像有效区域的检 测和分割。-般情况下,对灰度图像的分割通常可基于像素灰度值的两个性质:不连续性 和相似性。图像固定区域内部的像素一般都具有灰度相似性,而在不同区域之间的边界上 一般具有灰度不连续性,也就是我们常说的区域边缘属性。
因此,灰度图像分割方法- -般 可以分为基于区域的方法和基于边界的方法。前者利用区域内的灰度相似性进行分割,后 者利用区域间的灰度不连续性进行分割。根据分割过程中选择的运算策略不同,分割算法 又可分为并行算法和串行算法。在并行算法过程中,所有检测和分割都可独立和同时地进 行,利于提高运算效率B]。在串行算法过程中,后续的处理流程要用到之前的步骤得到的 结果,要求程序运行具有连续性。
2.3.1 基于区域的分割方法
基于区域的分割方法以区域内像素的相似性特征为依据,将图像划分成一系列有 意义的独立区域,实现分割的目标。图像进行区域分割- -般有以下特征。
(1)--致性。图像分割后的区域应在某些特征方面表现出一致性,如灰度、颜色 或纹理。
(2)单一性。区域内部目标分布单- -, 不能包含太多孔洞。
(3)差异性。区域内部的同一特征在相邻区域间应有明显的差异性。
(4)准确性。区域间的分割边界应该有光滑性,且边界的空间位置准确。
基于区域的分割方法常用的有灰度阈值法和区域增长法等,其特点是充分利用了 区域内像素特征的相似性。
2.3.2 基于边界的分割方法
基于边界的分割方法也称为基于梯度的图像分割方法,其关键步骤是进行边缘检测。 基于边界的分割方法首先检测图像中的边缘点,然后按照-定的策略连接成轮廓线得到边 界,最后根据边界得到分割区域。由于图像边界具有梯度峰值的特点,所以该方法又称为 基于梯度的图像分割方法。其中,进行边缘检测的常用方法有图像微分(差分)、梯度和. 拉普拉斯变换等。
如果仅进行边缘检测还不等于图像分割的完成,则还需要继续将边缘点按某种策略连 接成边缘线,形成直线、曲线、轮廓线等,直到能表示图像区域的边界。其中,边缘点连 接成线包括两个过程:检测可能的边缘点;将得到的边缘点通过连接或拟合等方式获取连 续的线(如直线、曲线、轮廓线等)。该方法涉及边缘检测,需要综合考虑图像抗噪性和 检测精度的矛盾:若提高抗噪性,则往往会产生边缘丢失或位置偏差;若提高检测精度, 则往往会产生噪声伪边缘或错误的轮廓。
3. 程序实现
本案例提出了一种能够有效识别答题卡的方法,利用基于Hough变换的直线检测技术 检测图像的倾斜度,对存在倾斜的图像进行旋转校正,最终实现答题卡答案的定位和检测。 其中,在识别过程中使用像素灰度积分统计的方法,具有较低的误识别率,能够准确定位 答题卡的涂卡痕迹。下面介绍程序实现过程中的关键步骤。
3.1.图像灰度化
根据答题卡图像的自身特点,本实验要求输入的图片为灰度格式,并将采集到的答题 卡图片经灰度化处理后存储到硬盘的指定文件夹,用于检测识别。采用灰度图像进行存储 能显著减少文件所占用的硬盘空间,而且能提高图像处理识别的速度。一般而言,可采用 加权平均值法对原始RGB图像进行灰度化处理,该方法的主要思想是从原图像中取R、G、 B各层像素值并经过加权求和得到灰度图的亮度值。
现实生活中,人眼对绿色(G)敏感度最高,对红色(R)敏感度次之,对蓝色(B)敏感度最低,因此为了选择合适的权值对象使之能够输出合理的灰度图像,权值系数应该满足G>R>B。实验和理论证明,当R、G、B的权值系数分别为0.299、0.587和0.114时,能够得到最适合人眼观察的灰度图像.
3.2.灰度图像二值化
图像二值化是图像处理的基本技术之一一,而阈值的选取则是图像二值化的关键步骤。 一般而言,对于灰度图像来说,可适当选择一个或若千个灰度值T (0≤T≤255)来进行二值化,将目标和背景分开,这个灰度值T就称为阈值。因此,对于答题卡图像来说,根据考生填涂答题卡的答案目标区域特点,可选择适当的阈值T进行二值化。当像素点的灰度,值小于T时,则将该点的颜色值置为“0”, 否则将其颜色值置为“1”。 这样就得到了只包含黑白两种颜色的二值图像。
3.3.图像平滑滤波
图像平滑滤波是一一种实用的数字图像处理技术,主要是为了减少图像的噪声,常用的有中值滤波、均值滤波等方法。中值滤波指将像素邻域的灰度值进行排序后取中位数值作为中心像素的新灰度值。答题卡图像在采集过程中经常会遇到随机噪声的干扰,该噪声一般是邻域中亮度值发生随机突变的像素,并且经排序后往往出现在序列的队首或队尾,故经中值滤波后答题卡图像的随机噪声能得到有效消除。
3.4.图像校正
对答题卡图像进行校正处理主要是进行图像旋转操作,便于后续的检测和识别。图像旋转的算法很多,本实验采用的算法思路为:将需调整的答题卡图像读取到内存中,计算图像的倾斜角度,依据所得的倾斜角度旋转图像,得到校正图像。根据答题卡图像的特点,答题卡的有效信息往往位于整幅图像的特定部位,一般包括考生准考证号区域、答案区域和考试科目区域三大部分,因此对这些区域进行精确的定位 即可提取图像的特征信息。答题卡图像一般由明确的矩形框和直线组成,在进行区域定位.时选择Hough变换来进行直线检测,进而获取定位信息,计算倾斜角度,之后进行图像旋转来得到校正结果。
3.5.填写检查
考生在涂卡时,由于种种原因可能会出现重选、漏选等错误,可根据对识别结果的影响分两种情况进行处理: . -种情况是如果考生的基本信息如专业、科目、班级、学号、试卷类型等客观信息出现重选、漏选错误,则在系统识别后会立即给出错误提示,要求确认修改图像或重新采集图像;另一种情况是如果考生填涂答案时出现重选、漏选错误,则可按答案选择错误对待,并将识别结果记入存储结构。最后,系统根据事先录入的标准答案与识别存储结构进行自动评分,从而获得每名考生的考试成绩信息。
主函数:
clc; clear all; close all; warning off all; I = imread('images\\1.jpg'); I1 = Image_Normalize(I, 0); hsize = [3 3]; sigma = 0.5; I2 = Image_Smooth(I1, hsize, sigma, 0); I3 = Gray_Convert(I2, 0); bw2 = Image_Binary(I3, 0); [~, ~, xy_long] = Hough_Process(bw2, I1, 0); angle = Compute_Angle(xy_long); [I4, bw3] = Image_Rotate(I1, bw2, angle*1.8, 0); [bw4, Loc1] = Morph_Process(bw3, 0); [Len, XYn, xy_long] = Hough_Process(bw4, I4, 0); [bw5, bw6] = Region_Segmation(XYn, bw4, I4, 0); [stats1, stats2, Line] = Location_Label(bw5, bw6, I4, XYn, Loc1, 1); [Dom, Aom, Answer, Bn] = Analysis(stats1, stats2, Line, I4);
代码部分详见:github.com/kivenyangmi…