实例应用:自动答卷评分【MATLAB实现】

  一则比较有意思的应用,来自斯坦福 EE368/CS232:Digital Image Processing 课程作业1

【另外,推荐大家去看看老外的课程设计,全是图像处理+android / ios,有题目,有代码,有说明,有海报及视频展示】

原文:

Automatic Quiz Grading

On the handouts webpage, you can find three scanned images of a multiple-choice quiz for an introductory algebra class:
. hw1_quiz_solution.jpg: official solution for the quiz created by the instructor
. hw1_quiz_student_1.jpg: responses given by student #1 in the class
. hw1_quiz_student_2.jpg: responses given by student #2 in the class

   Develop and describe the steps for an image processing algorithm that automatically computes the number of wrong answers for each student. Show any intermediate images produced in the algorithm to help explain the individual steps. Report the number of wrong
answers for student #1 and student #2 as determined by your algorithm. You can exploit the fact that each circle used in a multiple-choice question covers approximately 85 pixels in these scanned images.

大致翻译:

 自动答题卡评卷【涂圆圈的】,有3张图片,一张为标准答案hw1_quiz_solution.jpg,两张学生答卷:hw1_quiz_student_1.jpg和hw1_quiz_student_2.jpg,现在要通过图像处理的方式,自动评卷。这里 ,答题填涂的圆圈像素大致为85

标准答案:

学生答卷1:

学生答卷2:

解决方案【我不贴英文了】

1.观察答卷发现,试卷的抬头和标题不是我们想关注的,因此舍弃图像的前17%,设置我们的ROI【感兴趣区域】

2.为了实现学生答卷和标准答案之间的配准:在水平和垂直方向,通过小范围偏移,使得均方误差最小【对准了试卷,再比较圆圈】

3.从标准答卷中减去学生答卷,计算差分图像

4.阈值化差分图像,统计大于阈值的像素个数,除以85,再除以2,即为错误答案个数

【这边除以2是因为当一题答错时,一定是这样:该涂黑的地方,没涂黑;该留白的地方,涂了黑。而差分图像计算了2次差异,故除以2】--- 我想了10分钟才弄明白,太笨了

另外,老外为了展示图像配准的重要性,故意弄了个对比实验:a.未配准,直接计算差分+统计;b.配准后,计算差分+统计

matlab实现:

clc;
clear all;

% Load solution image
imgSolution = im2double(imread('hw1_quiz_solution.jpg'));
[height, width] = size(imgSolution);
rowsROI = round(0.17*height):height;
imgSolution = imgSolution(rowsROI, :);
[height, width] = size(imgSolution);

% Define parameters
circleArea = 85;
threshold = 0.8;

% Load test image
%imgTest = im2double(imread('hw1_quiz_student_1.jpg'));
imgTest = im2double(imread('hw1_quiz_student_2.jpg'));
imgTest = imgTest(rowsROI, :);

% Estimate number of wrong answers without alignment
imgDiffUnalign = abs(imgTest - imgSolution);
imgDiffUnalignThresh = imgDiffUnalign > threshold;
numDiffUnalign = sum(imgDiffUnalignThresh(:)) / circleArea;
numWrongUnalign = numDiffUnalign / 2

% Perform alignment
minSSE = inf;
for dx = -1 : 0.25 : 1
    for dy = -2 : 0.25 : 2
        A = [1 0 dx; 0 1 dy; 0 0 1];
        tform = maketform('affine', A.');
        imgTform = imtransform(imgTest, tform, 'bilinear', ...
            'XData', [1 width], 'YData', [1 height], ...
            'FillValues', 1);
        imgSSE = sum(sum((imgTform - imgSolution).^2));
        if imgSSE < minSSE
            minSSE = imgSSE;
            imgTestAlign = imgTform;
            bestDx = dx;
            bestDy = dy;
        end
    end % dy
end % dx
disp(sprintf('Best dx = %.2f, dy = %.2f', bestDx, bestDy));

% Estimate number of wrong answers with alignment
imgDiffAlign = abs(imgTestAlign - imgSolution);
imgDiffAlignThresh = imgDiffAlign > threshold;
numDiffAlign = sum(imgDiffAlignThresh(:)) / circleArea;
numWrongAlign = numDiffAlign / 2

% Show images
warning off;
figure(1); clf; set(gcf, 'Color', 'w');
imshow(imgDiffUnalign,[0 1]); colorbar;
title('Difference without Alignment');
figure(2); clf; set(gcf, 'Color', 'w');
imshow(imgDiffUnalignThresh);
title('Difference without Alignment - Thresholded');
figure(3); clf; set(gcf, 'Color', 'w');
imshow(imgDiffAlign,[0 1]); colorbar;
title('Difference with Alignment');
figure(4); clf; set(gcf, 'Color', 'w');
imshow(imgDiffAlignThresh);
title('Difference with Alignment - Thresholded');

实验结果

学生答卷1:

未配准差分图像:                                                                   

阈值化未配准差分图像:

配准后差分图像:                                                                     

阈值化配准后差分图像:

Paper1的控制台结果:

学生答卷2:

配准后差分图像:                                                               

阈值化配准后差分图像:

Paper2 控制台结果:

由于提到了图像配准,这里 附上仿射变换矩阵的原理图:

仿射变换是一种常用矩阵变换,二维图像的仿射变换可以表示成如下矩阵的形式:

这里(w,z)为原始坐标,(x,y)为新坐标。

  由于拍摄答卷时,或多或少有偏移,因此在计算图像差分前,应该先进行配准。如果在本次应用中只考虑旋转和平移,则仿射变换矩阵为:

 而老外的代码中,theta设为0,仅仅从水平和垂直方向去搜索,使得均方差最小。

接下来是一些matlab语言类的处理,比如构造TFORM结构体和imtransform函数的使用,大家自己查帮助文档吧。

 

Happy Valentine's Day!

时间: 2024-09-05 03:31:45

实例应用:自动答卷评分【MATLAB实现】的相关文章

【MySQL】MySQL多实例开机自动重启

一 简介    作为MySQL DBA ,在维护数据库的过程中,偶尔会遇到服务器异常crash/重启情况,DBA需要在机器重启之后将MySQL数据库重启(当然也有可能其他的数据库本文重点介绍MySQL).如果是一台机器重启或者少数几个实例还好方便维护,当实例个数成百上千时,遇到硬件更换,需要批量重启服务器时,一个个人肉重启数据库实例未免太过麻烦.我们需要一种随服务器开机自动重启的机制.二 Linux 服务器启动 知识点 redhat的启动方式和执行次序是:  1 加载内核 2 执行init程序

Flash动画制作实例:扇子自动打开动画

操作步骤如下: #p#副标题#e# #p#副标题#e# #p#副标题#e# 还有的折扇比如檀木扇,没扇面,直接是木片排成的,你也可以尝试做一下. 主要的知识点是: 1.FLASH图形绘制技巧 2.位图填充及调整 3.多层元件补间动画 4.遮罩的应用 汗,图终于发好了.... 增加动画:02演示 ≯全屏显示或下载≮

《MATLAB/Simulink系统仿真超级学习手册》——2.7 MATLAB编程实例

2.7 MATLAB编程实例 MATLAB/Simulink系统仿真超级学习手册 MATLAB强大的运算功能和图形功能,是实现各领域的编程仿真的有力工具.本节将综合本章所讲的内容介绍MATLAB的一些编程实例,使读者对MATLAB语言的应用有一些基本的了解. 2.7.1 汉诺塔问题 Hanoi(汉诺)塔问题,是一个古典的数学问题,是一个用递归方法解题的典型例子.问题是这样的:古代有一个梵塔,塔内有3个座A.B.C,开始时A座上有n个盘子,盘子大小不等,大的在上,小的在下如图2-35所示. 现在,

Android 实现自动打电话与发短信的实例

Android 实现自动打电话与发短信的实例 一.自动可以拨打电话 bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { EditText et = (EditText)findViewById(R.id.et); String number = et.getText().toString(); //激活可以打电话的组件 Intent intent = new I

Oracle实例恢复概述

一.Oracle实例失败 Oracle实例失败多为实例非一致性关闭所致,通常称为崩溃(crash).实例失败的结果等同于shutdown abort. 实例失败的原因 电源负载故障 硬件故障 后台进程失败 异常关闭数据库 实例失败后的状况 数据库可能丢失已提交的事务以及存储了未提交的事务,导致数据库出现不一致的情况 解决方案 使用startup 重新启动实例.实例实现自动恢复,根据联机日志文件前滚提交的事务,回滚未提交的事务 查看告警日志.跟踪日志等找出出现故障的原因 二.检查点 检查点在体系结

Shiro安全框架入门篇(登录验证实例详解与源码)

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 目录(?)[+] 一.Shiro框架简单介绍 Apache Shiro是Java的一个安全框架,旨在简化身份验证和授权.Shiro在JavaSE和JavaEE项目中都可以使用.它主要用来处理身份认证,授权,企业会话管理和加密等.Shiro的具体功能点如下: (1)身份认证/登录,验证用户是不是拥有相应的身份:  (2)授权,即权限验证,验证某个已认证的用户是否拥有某个权限:即判断用户是否能做

WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[下篇]

在[第2篇]中,我们深入剖析了单调(PerCall)模式下WCF对服务实例生命周期的控制,现在我们来讨轮另一种极端的服务实例上下文模式:单例(Single)模式.在单例模式下,WCF通过创建一个唯一的服务实例来处理所有的客户端服务调用请求.这是一个极端的服务实例激活方式,由于服务实例的唯一性,所有客户端每次调用的状态能够被保存下来,但是当前的状态是所有客户端作用于服务实例的结果,而不能反映出具体某个客户端多次调用后的状态.WCF是一个典型的多线程的通信框架,对并发的服务调用请求是最基本的能力和要

【分享】Matlab R2015a 发布啦!

本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html Matlab和C#混合编程文章目录:http://www.cnblogs.com/asxinyu/p/4329753.html Matlab还是一如既往的每年2个版本的发布速度.2015年3月R2015a (版本 8.5) 正式发行.在新版本中,带有四个新的工具箱以及79个产品进行的更新.MATLAB 2015a 中的许多新功能都是在 R2014b 的功能基础上升级而来的,其中

【ASM】自动存储管理的新特性

内容摘要:用于管理 ASM 实例的新的 SYSASM 角色.用于降低共享池使用的可变的区大小,以及实例能够读取磁盘组的特定磁盘,这些都是 Oracle 数据库 11g ASM 中引入的一些重要新特性. 转自:http://doc.chinaunix.net/oracle/200812/207479.shtml SYSASM 角色     自动存储管理 (ASM) 是在 Oracle 数据库 10g 中引入的,它在某种程度上打破了 DBA 和系统管理员之间在存储分配功能上的界限.ASM 实例由 D