matlab答题卡识别程序
opencv实现答题卡识别
opencv实现答题卡识别本⽂实例为⼤家分享了opencv实现答题卡识别的具体代码,供⼤家参考,具体内容如下"""识别答题卡"""import cv2import numpy as npdef showImg(img_name, img):cv2.imshow(img_name, img)cv2.waitKey()cv2.destroyAllWindows()def get_max_rect(sorted_cnts):for cnt in sorted_cnts:# 轮廓近似possible_cnts = []epsilon = 0.1 * cv2.arcLength(cnt, True)approx = cv2.approxPolyDP(cnt, epsilon, True)if len(approx) == 4:possible_cnts.append(cnt)possible_cnts = sorted(possible_cnts, key=lambda x: cv2.arcLength(x, True))return possible_cntsdef get_max_bounding_rect(possible_cnts):# for cnt in possible_cnts:# x, y, w, h = cv2.boundingRect(cnt)sorted_cnts = sorted(possible_cnts, key=lambda cnt: cv2.boundingRect(cnt)[2]*cv2.boundingRect(cnt)[3], reverse=True) print(sorted_cnts[0])def show_countour(img, cnt):img_copy = img.copy()cv2.drawContours(img_copy, cnt, -1, (0,255, 0), 3)showImg("img_copy", img_copy)# 读取答题卡图⽚,并显⽰answer_sheet_img = cv2.imread("t1.jpg")print(answer_sheet_img.shape)showImg("answer_sheet_img", answer_sheet_img)# ⾼斯滤波,去除噪⾳blur = cv2.GaussianBlur(answer_sheet_img,(5,5),0)showImg("blur", blur)# 图像转灰度值sheet_gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)showImg("sheet_gray", sheet_gray)# ⼆值化retval, sheet_threshold = cv2.threshold(sheet_gray,177, 255, cv2.THRESH_BINARY)# print(type(sheet_threshold), sheet_threshold)showImg("sheet_threshold", sheet_threshold)# 边界检测edges = cv2.Canny(sheet_threshold, 100, 200)showImg("edges", edges)# print(type(edges))# 寻找轮廓copy_edges = edges.copy()img_copy = answer_sheet_img.copy()img, cnts, hierarchy = cv2.findContours(copy_edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)cv2.drawContours(img_copy, cnts, -1, (0,0,255), 1)showImg("img_copy", img_copy)# 对所有轮廓加⼀个外接矩形,找最⼤的外接矩形max_area_index = Nonearea = 0for index, cnt in enumerate(cnts):x, y, w, h = cv2.boundingRect(cnt)if w*h > area:max_area_index = indexshow_countour(answer_sheet_img, cnts[max_area_index])# 仿射,拿到答题卡主要部位x, y, w, h = cv2.boundingRect(cnts[max_area_index]) # 最⼤的边界cv2.rectangle(answer_sheet_img, (x, y),(x+w, y+h), (0,0,255), 2)showImg("answer_sheet_img", answer_sheet_img)pts1 = np.float32([[x,y], [x+w, y], [x+w, y+h]])pts2 = np.float32([[0,0], [w, 0], [w, h]])M = cv2.getAffineTransform(pts1, pts2)sheet_threshold_copy = sheet_threshold.copy()dst = cv2.warpAffine(sheet_threshold_copy, M, (w, h))showImg("dst", dst)print(answer_sheet_img.shape)part_sheet_img = answer_sheet_img[y:y+h, x:x+w]showImg("part_sheet_img", part_sheet_img)# 对答案区域灰度,⼆值,找轮廓part_answer_gray = cv2.cvtColor(part_sheet_img, cv2.COLOR_BGR2GRAY) # 灰度ret, threshold_answer = cv2.threshold(part_answer_gray, 175, 255, cv2.THRESH_BINARY)showImg("threshold_answer", threshold_answer)img, answer_cnts, x = cv2.findContours(threshold_answer, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) part_sheet_img_copy = part_sheet_img.copy()cv2.drawContours(part_sheet_img_copy, answer_cnts, -1, (0, 0, 255), 1)showImg("dst_copy", part_sheet_img_copy)# 对所有轮廓找外接矩形,想过滤掉不合适的矩形print("画矩形")answer_filter_cnts = []answer_circles = []img_ = part_sheet_img.copy()for cnt in answer_cnts:x, y, w, h = cv2.boundingRect(cnt)if 30<w<40 and 30<h<40:print(x, y, w, h)circle_x = int(x + w/2)circle_y = int(y+h/2)r = int((w+h)/4)answer_circles.append((circle_x, circle_y, r))answer_filter_cnts.append(cnt)answer_filter_cnts = np.array(answer_filter_cnts)cv2.drawContours(img_, answer_filter_cnts, -1, (0, 0, 255), 1)# cv2.rectangle(img, (x, y), (x+w, y+h), (0,255,0), 2)showImg("img_", img_)print("geshu", len(answer_circles))# 从answer_circles中取25个mask_dict = {1:[],2:[], 3:[], 4:[],5:[]} # ⼀共不⼀定是25个圆,将圆按照题⽬⾏分类,sorted_y_answer_circles = sorted(answer_circles, key=lambda circle: circle[1])print("sorted_y_answer_circles", sorted_y_answer_circles)set_num = 1for index, circle in enumerate(sorted_y_answer_circles):if index == 0:mask_dict[1].append(circle)else:if circle[1] - sorted_y_answer_circles[index-1][1] > 30:set_num += 1mask_dict[set_num].append(circle)else:mask_dict[set_num].append(circle)print("mask_dict", mask_dict)for k, mask_circle_list in mask_dict.items(): # 对每⼀个题⽬,保留五个答案,多余的舍去if len(mask_circle_list) == 5:sorted_x_mask_circle_list = sorted(mask_circle_list, key=lambda x:x[0])mask_dict[k]=sorted_x_mask_circle_listelse:sorted_x_mask_circle_list = sorted(mask_circle_list, key=lambda x: x[0])sorted_x_mask_circle_list_5 = []for i, c in enumerate(sorted_x_mask_circle_list):if i == 0:sorted_x_mask_circle_list_5.append(c)else:if abs(c[0] - sorted_x_mask_circle_list[i-1][0]) < 10:passelse:sorted_x_mask_circle_list_5.append(c)mask_dict[k] = sorted_x_mask_circle_list_5print("mask_dict", mask_dict)# mask_dict 分好组的按照顺序的圈圈# 做掩码mask_img = np.zeros_like(part_sheet_img, dtype='uint8') # 全⿊图showImg("threshold_answer", threshold_answer)threshold_answer = np.array(threshold_answer)# mask_dict = sorted(mask_dict, key=lambda x: mask_dict.keys())all_scores = [] # 所有答案处的评分for exercise_num, circle_mask_list in mask_dict.items():# 对于每⼀题score_list = [] # 每⼀题的每个选项的评分,涂⿊的为选择的,值越接近0,评分较低for circle_mask in circle_mask_list:mask_img_copy = cv2.cvtColor(mask_img, cv2.COLOR_BGR2GRAY)# 做⼀个当前圆的掩码:cv2.circle(mask_img_copy, (circle_mask[0], circle_mask[1]), circle_mask[2], (255, 255, 255), -1) print(threshold_answer.shape, mask_img_copy.shape)mask_img_ = cv2.bitwise_and(threshold_answer, threshold_answer, mask=mask_img_copy) score = mask_img_.sum()score_list.append(score)# showImg("mask_img_", mask_img_)all_scores.append(score_list)all_score_np = np.array(all_scores)s = np.argmin(all_score_np, axis=1) # 找评分最低处即为选择项answer_dict = {0: "A",1: "B",2: "C",3: "D",4: "E"}for index, v in enumerate(s):print("第%s题的答案是%s" %(index+1, answer_dict[v]))效果图:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
如何使用Matlab进行模式识别和特征提取技术实现
如何使用Matlab进行模式识别和特征提取技术实现Matlab是一种强大的编程语言和软件环境,广泛应用于科学计算、工程设计和数据分析等领域。
在模式识别和特征提取技术方面,Matlab也提供了许多强大的工具和函数。
本文将介绍如何使用Matlab来实现模式识别和特征提取技术,以及一些常用的方法和技巧。
一、Matlab在模式识别和特征提取中的应用模式识别是一种通过分析和理解数据中的模式和规律,将其归类或预测的技术。
在实际应用中,模式识别可以用于图像处理、语音识别、生物医学信号分析等领域。
而特征提取则是从原始数据中提取有用的信息或属性,用于模式识别任务。
Matlab在模式识别和特征提取方面提供了丰富的工具箱和函数,包括图像处理工具箱、信号处理工具箱、模式识别工具箱等。
这些工具可以极大地简化模式识别和特征提取的过程,提高开发效率。
二、图像处理中的模式识别和特征提取技术图像处理是模式识别和特征提取的一个重要应用领域。
在Matlab中,可以利用图像处理工具箱进行相关操作。
1. 图像滤波图像滤波是一种常用的图像处理技术,用于去除图像中的噪声和增强图像的特征。
Matlab提供了各种滤波函数,如均值滤波、中值滤波、高斯滤波等。
通过选择合适的滤波函数和参数,可以实现图像的模糊、锐化等效果。
2. 边缘检测边缘检测是一种常用的特征提取技术,可以用于提取图像中的轮廓和边缘信息。
Matlab提供了多种边缘检测算法,如Canny算子、Sobel算子等。
通过使用这些算法,可以快速准确地提取图像中的边缘信息。
3. 特征描述特征描述是将图像中的局部特征转换为可用于模式识别的数值特征的过程。
在Matlab中,可以使用SIFT、SURF等算法进行特征描述。
这些算法可以提取图像中的关键点,并计算其对应的特征向量。
4. 特征匹配特征匹配是一个关键的步骤,用于将提取到的特征向量与待识别的模式进行匹配。
Matlab中提供了强大的特征匹配函数,如ORB匹配、FLANN匹配等。
使用Matlab进行模式识别的基本步骤
使用Matlab进行模式识别的基本步骤引言:模式识别是一种通过对数据和信号进行分析,以识别和分类模式的技术。
它在众多领域中都有广泛的应用,如图像处理、语音识别、生物信息学等。
而Matlab作为一种强大的科学计算软件,为模式识别提供了丰富的工具包和算法库。
本文将介绍使用Matlab进行模式识别的基本步骤,帮助读者了解模式识别的基本流程和方法。
一、数据预处理在进行模式识别之前,首先需要对数据进行预处理。
数据预处理可以分为以下几个步骤:1. 数据采集与收集:从实验或实际应用中获取所需的数据,可以利用传感器、仪器等设备进行数据采集,或从数据集合中获取。
2. 数据清洗:对数据进行清洗和去噪,去除噪声、异常值和缺失值等,以确保所使用的数据可靠。
3. 特征提取:对数据进行特征提取,将数据转换为更加有意义和可分辨的特征。
常用的特征提取方法包括主成分分析(PCA)、离散小波变换(DWT)等。
4. 数据归一化:对数据进行归一化处理,消除不同尺度和单位的影响,使得数据处于相同的量级。
二、模式分类模式分类是模式识别的核心任务之一,其目标是通过已知的样本数据来训练分类器,以便对未知的数据进行分类。
在Matlab中,可以使用各种机器学习算法进行模式分类,如支持向量机(SVM)、人工神经网络(ANN)、决策树等。
1. 数据分割:将已知的样本数据分成训练集和测试集,一般将训练集占总数据的70%-80%,测试集占20%-30%。
分割数据的目的是为了验证分类器的性能和准确率。
2. 特征选择:选择合适的特征子集,以减少特征维度和提高分类器的效果。
3. 分类模型训练:使用训练集来训练分类模型,根据选择的算法和特征,通过迭代和优化的方式,得到最优的分类模型。
4. 分类模型评估:利用测试集对分类模型进行评估,计算分类的准确率、召回率、F1得分等指标,评估分类器的性能和效果。
三、模式识别应用模式识别在各个领域都有广泛的应用。
本节将介绍几个常见的模式识别应用案例,并简要介绍使用Matlab进行处理的方法。
基于MATLAB的答题卡识别软件设计
关键词:答题卡识别 霍夫变换 区域分割
引言:目前,考试的主流方法是以试卷的考试为主。自动阅卷 系统的研究主要是基于计算机图像处理技术的光标读取器和答 题卡标识系统。基于数字图像处理技术,需要提前扫描考生答题 卡生成电子图像文件,然后存储在计算机中。在处理时直接在软件 中读入。利用数字图像处理的各种技术和方法,对考生的考试成 绩进行识别。利用这种技术不仅可以节省考试管理和考核部门的 人力,物力,而且也能提高工作效率,提高评估的公平性。本文用 Matlab 设计了答题卡识别软件,用于对答题卡信息及成绩的自动 识别计算。
数码世界 P.90
1 答题卡识别软件设计 1.1 系统软件设计 系统软件包括: (1)答题卡的读取; (2)图像预处理部分:包括图像灰度化、二值化等; (3)对图像进行霍夫变换得到霍夫变换域,用于检测答题卡中 的直线段; (4)计算倾斜角度,矫正图像:Hough 变换检测到的直线可以 计算出直线的斜率,然后用反三角函数可以得到倾斜角度。再对图像 进行旋转,得到符合要求的图像; (5)对图像进行滤波并进行区域划分:原图像的二值化图像有 噪声,所以利用除噪函数进行滤波,然后根据答题卡的特征划分区域; (6)分割图像,生成网格线:根据答题卡的特点划分区域,再根 据答题卡的填涂区域分布进行网格线划分; (7)识别和显示:识别考上学号、考试科目、考生答案,用 GUI 界面显示。 1.2 Hough 变换倾斜矫正 霍夫变换可以识别出图像中的几何形状,可以分离出图像中圆、 矩形等特殊的形状。其最基本的功能是在图像中检测直线或者曲线。 霍夫变换算法将每个像素坐标点 P(x,y) 转换到 (r,theta) 的曲 线点上面,累加到对应的格子数据点,当一个波峰出现时候,说明有 直线存在。通过 Hough 变换检测出了很多条直线,选取最长的那条 直线,计算其斜率,然后进行倾斜矫正,则可获得答题卡图像的倾斜 矫正结果。 1.3 图像分割及网格线的生成 在原图像中标记出 Hough 变化检测出的的最长直线。则标记出 直线的上部分为答题卡类型区、考生考号区和考试科目部分,下部分 为答案区。 从 Hough 变换检测出的峰值中获取最长的三条,其中一条竖直 定位线、一条区域分割线和一条底部线,那么根据坐标可以选取区域 分界线作为基准,用底部线配合计算得到四条答题区边界线。 以横向检测到的第一个像素不为 0 的点作为一条直线的起始点 划横线,再以竖向检测到的第一个像素不为 0 的点作为起始点划竖线。 在获取了答题区四条边界线后需要对其区域进行进一步划分,首 先计算答题区六个横向区域的底部横线纵坐标如公式(1):
如何使用Matlab进行目标检测与识别
如何使用Matlab进行目标检测与识别目标检测与识别是计算机视觉领域的重要研究方向,它可以在图像或视频中自动识别出感兴趣的目标物体。
Matlab作为一款强大的数学建模和仿真软件,在目标检测与识别方面也提供了丰富的工具和函数库。
本文将介绍如何使用Matlab进行目标检测与识别的基本流程及常用方法。
一、图像预处理在进行目标检测与识别之前,我们通常需要对图像进行预处理,以提高后续算法的效果。
常见的图像预处理方法包括图像去噪、图像增强、边缘检测等。
在Matlab中,可以使用imnoise、imfilter、edge等函数实现这些功能。
例如,下面是一个图像去噪的示例代码:```matlabI = imread('lena.png'); % 读取图像J = imnoise(I, 'salt & pepper', 0.02); % 添加椒盐噪声K = medfilt2(J, [3, 3]); % 中值滤波去噪imshowpair(J, K, 'montage'); % 显示去噪前后对比图像```二、特征提取特征提取是目标检测与识别的关键步骤,它可以将图像中的目标物体与背景进行区分。
在Matlab中,可以使用多种特征提取方法,如颜色特征、纹理特征、形状特征等。
下面以颜色特征为例,展示如何使用颜色直方图提取特征:```matlabI = imread('apple.jpg'); % 读取图像I = imresize(I, [256, 256]); % 调整图像大小Ihsv = rgb2hsv(I); % 转换为HSV颜色空间h = imhist(Ihsv(:, :, 1), 16); % 计算H通道的直方图h = h / sum(h); % 归一化直方图bar(h); % 显示直方图```三、目标检测目标检测是指在图像中准确定位出目标物体的位置。
MATLAB中的模式识别与特征提取技巧分享
MATLAB中的模式识别与特征提取技巧分享引言在计算机科学和工程领域,模式识别和特征提取是重要的研究方向。
它们广泛应用于图像识别、语音识别、自然语言处理等领域。
而MATLAB作为一种强大的数学软件,提供了许多便捷的工具和函数来实现模式识别和特征提取的任务。
本文将分享一些在MATLAB中进行模式识别和特征提取的技巧和经验。
一、数据预处理在进行模式识别和特征提取之前,数据预处理是必不可少的步骤。
数据预处理的目的是对原始数据进行清洗、归一化和降噪等操作,以增强特征的可靠性和稳定性。
MATLAB提供了丰富的函数和工具来实现数据预处理的任务。
1. 数据清洗数据清洗是指通过去除数据中的噪声、异常值和错误数据等,使得数据更加纯净和可靠。
MATLAB中可以使用统计工具箱中的函数,如mean、std和quantile等,来分析数据的分布和异常情况,并进行适当的处理。
此外,MATLAB还提供了一些图形工具,如boxplot和scatterplot等,用于可视化数据分布和检测异常点。
2. 数据归一化数据归一化是指将不同量纲的数据,通过某种数学变换,映射到相同的尺度范围内。
常用的数据归一化方法有最小-最大归一化和标准化等。
在MATLAB中,可以使用min和max函数实现最小-最大归一化,使用zscore函数实现标准化。
另外,MATLAB还提供了一些图形工具,如histogram和histfit等,用于分析和可视化归一化后的数据分布。
3. 数据降噪数据降噪是指通过滤波和去除干扰,提取出数据的关键特征。
MATLAB中有各种滤波函数,如medfilt1、smoothdata和wiener2等,可以用于实现不同类型的滤波操作。
此外,MATLAB还提供了一些信号处理工具箱,如Wavelet Toolbox和Filter Design Toolbox等,可以实现更高级的降噪和滤波操作。
二、特征提取特征提取是模式识别的关键步骤,它把原始数据转化为能够描述和区分不同模式的特征向量。
基于matlab中ocr函数
基于matlab中ocr函数OCR技术是一种将图像中的文字转换成文本的技术。
现今,OCR 技术广泛应用于各种场合,包括扫描仪、数字化文档处理、自动识别等。
随着计算机技术的发展,OCR技术也愈加成熟,成为了数字化时代的重要组成部分。
在OCR技术中,MATLAB中的OCR函数是非常重要的一部分。
开发一个基于MATLAB中OCR函数的程序,需要以下几个步骤:1.图像预处理在进行OCR识别之前,需要对图像进行预处理。
图像预处理的主要目的是降低噪声的影响,使得OCR能够更加准确地识别文本。
对于二值化图像而言,可以对其进行去噪、二值化操作,以增加图像的清晰度和可识别性。
MATLAB中提供了丰富的图像处理工具,可以帮助我们快速完成这些预处理操作。
2.调用OCR函数在预处理完图像之后,需要调用OCR函数进行识别。
MATLAB中的OCR函数可以将图像中的文本转换成字符向量。
OCR函数具体的使用方法为:- 构建OCR对象调用OCR函数之前,需要先构建一个OCR对象:ocrObj = ocr(I)其中,I为载入的图像。
构建完成后,我们可以设置一些OCR参数,包括识别语言、字符集等。
- 进行文本识别当OCR对象构建完成之后,我们可以用它来进行文本识别:text = ocrObj(I)其中,I为图像数据。
识别之后,OCR函数会将文本转换为字符向量,包含文本的字符和空白字符。
3.输出结果最后,我们可以将OCR函数的识别结果输出。
我们可以将字符向量转换为字符串,并将其打印输出或保存到文本文件中。
综上所述,基于MATLAB中OCR函数开发OCR程序的流程包括以下几个步骤:图像预处理、调用OCR函数、输出结果。
在实际操作中,我们还需要根据实际需求对OCR函数的参数进行调整,以达到最佳的识别效果。
OCR技术的应用前景非常广泛,相信在不久的将来,OCR技术会成为更多领域不可或缺的一部分。
答题卡检测系统设计与实现
答题卡检测系统设计与实现陈敏(湖北大学计算机与信息工程学院,湖北武汉430062)摘要:文章介绍了一个基于MATLAB的答题卡检测系统,旨在解决答题卡检测中存在的人工误差和时间成本等问题。
该系统采用计算机视觉和图像处理技术,通过对答题卡图像进行自动识别和分析,实现对答案区域的定位和得分计算。
具体而言,系统采用基于轮廓和几何形状特征的答案区域识别方法,使用MATLAB的图像处理工具箱对答题卡图像进行预处理和分割,然后利用模板匹配和形态学变换等技术对答案区域进行识别和得分计算。
通过实验验证,本系统在多种答题卡格式和设计下,均能实现较高的识别准确率和得分计算精度,同时具有良好的兼容性和安全性。
因此,该系统可以满足不同考试的需求,并为自动化考试和教育评估等领域提供一种可靠的解决方案。
关键词:MATLAB;答题卡检测系统;计算机视觉;图像处理中图分类号:TP311文献标识码:A文章编号:2096-9759(2023)07-0129-03Answer card detection system design and implementationCHEN Min(School of Computer and Information Engineering,Hubei University,Wuhan430062,China)Abstract:This article presents a MATLAB-based system for detecting answer sheets,aimed at resolving issues such as manual errors and time consumption.The system employs computer vision and image processing technologies to automatically recog-nize and analyze answer sheet images,achieving accurate localization and score calculation of the answer areas.To accomplish this,the system uses contour and geometric shape features for answer area recognition,with pre-processing and segmentation of the answer sheet images performed using MATLAB's image processing toolbox.The answer area is then identified and scored through techniques such as template matching and morphological transformation.Experimental verification has shown that this system achieves high recognition accuracy and score calculation precision across various answer sheet formats and designs, while ensuring excellent compatibility and security.Thus,this system can effectively cater to different examination requirements and provide a reliable solution for automated testing and educational evaluation.Key words:MATLAB;Answer card detection system;Computer Vision;Image Processing0引言近年来,随着教育行业的快速发展和技术的不断进步,自动化考试和评估系统逐渐得到广泛应用。
基于数字图像处理技术的答题卡识别方法(图像处理课程练习)
XX大学2013-2014学年第二学期课程考核《图像处理》综合设计报告基于数字图像处理技术的答题卡识别方法学号 ___________________姓名 ___________________班级 ________________日期 ______________________本人郑重声明:本人认真、独立完成了查找资料、编写程序、撰写报告等考核任务。
签字:日期:随着科技的发展,电子与计算机技术的进步,答题卡的出现大大减轻教学工作者们批改试卷的工作量。
答题卡是光标阅读机输入信息的载体,是配套光标阅读机的各种信息录入表格的总称。
答题卡将用户需要的信息转化为可选择的选项,供用户涂写。
OMR是用光学扫描的方法来识别按一定格式印刷或书写的标记,并将其转换为计算机能接受的电信号的设备,并根据信息点的涂与未涂和格式文件设置将信息还原。
因此,如何将答题卡填涂的黑色区域识别出来并使用计算机进行处理是极为关键的。
本论文探索了有效识别答题卡的方法,以matlab为工具,基于数字图像处理技术对答题卡填涂区域进行了识别,并对识别的结果进行了处理,得到了结果。
本论文利用Hough变换的直线检测技术检测图像的倾斜度,判断图像是否倾斜,对存在倾斜的图像进行旋转校正。
最终实现答题卡答案的定位和检测。
论文使用像素统计方法进行识别,利用黑白颜色灰度值的巨大差异对二值图像的灰度值进行累加并进行阈值判定,识别错误效率极低,能够准确的识别答题卡的涂卡标记。
关键词:Hough变换,答题卡识别,matlab,一、设计任务、目的和要求本设计以matlab为工具利用数字图像处理技术对答题卡进行了识别,并对识别结果进行了处理。
注意到答题卡在采集图像的过程中由于各种原因可能会产生图像倾斜、水平或垂直错位,要进行正确识别首先必须对其进行校正,再依据像素检索技术进行识别。
二、总体方案设计说明系统运行环境,编程软件平台,编码算法原理,算法流程图设计本系统运行在当今主流的Win dows7系统,使用较新的MATLAB2012b进行设计。
模式识别课matlab数字识别程序
模式识别课matlab数字识别程序————————————————————————————————作者:————————————————————————————————日期:ﻩ名称: 模式识别题目: 数字‘3’和‘4’的识别实验目的与要求:利用已知的数字样本(3和4),提取样本特征,并确定分类准则,在用测试样本对分类确定准则的错误率进行分析。
进一步加深对模式识别方法的理解,强化利用计算机实现模式识别。
实验原理:1.特征提取原理:利用MATLAN软件把图片变为一个二维矩阵,然后对该矩阵进行二值化处理。
由于“3”的下半部分在横轴上的投影比“4”的下半部分在横轴上的投影宽,所以可以统计‘3’‘4’在横轴上投影的‘1’的个数作为一个特征。
又由于‘4’中间纵向比‘3’的中间‘1’的个数多,所以可以统计‘4’和‘3’中间区域‘1’的个数作为另外一个特征,又考虑‘4’的纵向可能会有点偏,所以在统计一的个数的时候,取的范围稍微大点,但不能太大。
2.分类准则原理:利用最近邻对测试样本进行分类实验步骤1.利用MATLAN 软件把前30个图片变为一个二维矩阵,然后对该矩阵进行二值化处理。
2.利用上述矩阵生成特征向量3.利用MATLAN软件把后5个图片变为一个二维矩阵,然后对该矩阵进行二值化处理。
4.对测试样本进行分类,用F矩阵表示结果,如果是‘1’表示分类正确,‘0’表示分类错误。
5.对分类错误率分析实验原始程序:f=zeros(5,2)w=zeros(35,2)q=zeros(35,2)for i=1:35'D:\MATLAB6p5\toolbox\images\imdemos\3\''.bmp'a=num2str (i)b=strcat()c=strcat(b,)d=imread(c)e=im2bw(d)n=0foru=1:20m=0for t=32:36if(e(t,u)==0)m=m+1endendif(m<5)n=n+1endendw(i,1)=nn=0for u=1:36for t=10:18n=n+e(u,t)endendw(i,2)=n'D:\MATLAB6p5\toolbox\images\imdemos\4\''.bmp'a=num2str(i)b=strcat()c=strcat(b,)d=imread(c)e=im2bw(d)n=0for u=1:20m=0fort=32:36if(e(t,u)==0)m=m+1endendif(m<5)n=n+1endendq(i,1)=nn=0for u=1:36for t=10:18n=n+e(u,t)endendq(i,2)=nendz=zeros(5,2)x=zeros(5,2)fori=1:5'D:\MATLAB6p5\toolbox\images\imdemos\3\''.bmp'a= num2str(i+35)b=strcat()c=strcat(b,)d=imread(c)e=im2bw(d)n=0for u=1:20m=0for t=32:36if(e(t,u)==0)m=m+1endendif(m<5)n=n+1endendz(i,1)=nn=0for u=1:36for t=10:18n=n+e(u,t)endendz(i,2)=n'D:\MATLAB6p5\toolbox\images\imdemos\4\' '.bmp'a= num2str(i)b=strcat()c=strcat(b,)d=imread(c)e=im2bw(d)n=0for u=1:20m=0fort=32:36if(e(t,u)==0)m=m+1endendif(m<5)n=n+1endendx(i,1)=nn=0for u=1:36fort=10:18n=n+e(u,t)endendx(i,2)=nendd1=10000*ones(5,2)d2=10000*ones(5,2)for i=1:5for j=1:35a=(w(j,1)-z(i,1))*(w(j,1)-z(i,1))+(w(j,2)-z(i,2))*(w(j,2)-z(i,2)) b=(q(j,1)-z(i,1))*(q(j,1)-z(i,1))+(q(j,2)-z(i,2))*(q(j,2)-z(i,2))if(a<d1(i,1))d1(i,1)=aendif(b<d1(i,2))d1(i,2)=bendendif(d1(i,1)<d1(i,2))f(i,1)=1endfor j=1:35c=(w(j,1)-x(i,1))*(w(j,1)-x(i,1))+(w(j,2)-x(i,2))*(w(j,2)-x(i,2))d=(q(j,1)-x(i,1))*(q(j,1)-x(i,1))+(q(j,2)-x(i,2))*(q(j,2)-x(i,2)) if(d2(i,1)>c)d2(i,1)=cendif(d2(i,2)>d)d2(i,2)=dendendif(d2(i,1)>d2(i,2))f(i,2)=1EndEnd实验结果:错误率为0.1,符合要求。
Matlab中的字母数字识别技术
Matlab中的字母数字识别技术近年来,随着人工智能技术的快速发展,机器学习和图像识别成为了热门话题。
其中,字母数字识别技术在多个领域有着广泛的应用,如自动驾驶、身份证识别等。
Matlab作为一款常用的科学计算软件,提供了丰富的工具和算法,使得字母数字识别变得更加便捷和高效。
一、字母数字识别技术的应用领域字母数字识别技术广泛应用于各个领域,如安全领域、商业领域、医疗领域等。
在安全领域,字母数字识别技术用于身份证、护照等证件的自动识别,可以大大提高工作效率和准确性。
在商业领域,字母数字识别技术可以用于快递单号识别、银行卡号识别等,方便了快递公司和银行的操作管理。
在医疗领域,字母数字识别技术可以用于病历号码和身体指标的自动识别,减少了人工操作的错误。
二、Matlab中的字母数字识别工具箱Matlab在字母数字识别领域提供了强大的工具箱,其中最常用的是图像处理工具箱和机器学习工具箱。
1. 图像处理工具箱Matlab的图像处理工具箱拥有丰富的图像处理函数和算法,可以用于图像的预处理、特征提取和分割。
在字母数字识别中,预处理是不可或缺的一环,通过去除噪声、灰度化和二值化处理,可以提高图像的质量和可分辨性。
特征提取是模式识别的关键,常用的特征包括形状、纹理和颜色等,通过提取图像的特征,可以准确地判断出字母数字的形状和特征。
图像的分割是将图像进行划分,将图像中的字母数字与其他背景区分开来,有助于后续处理和识别。
2. 机器学习工具箱机器学习工具箱是Matlab中用于实现机器学习算法的重要工具。
在字母数字识别中,常用的机器学习算法包括支持向量机(SVM)、神经网络和随机森林等。
支持向量机是一种二分类算法,通过寻找最优的超平面来实现对字母数字的分类。
神经网络是一种模拟人脑神经元的计算模型,可以通过训练样本来学习字母数字的特征和规律。
随机森林是一种集成学习算法,通过构建多个决策树进行分类,提高了分类的准确性和鲁棒性。
基于某数字图像处理技术地答题卡识别方法(图像处理课程练习)
××大学2013-2014学年第二学期课程考核《图像处理》综合设计报告基于数字图像处理技术的答题卡识别方法学号姓名班级日期本人郑重声明:本人认真、独立完成了查找资料、编写程序、撰写报告等考核任务。
签字:日期:摘要背景:随着科技的发展,电子与计算机技术的进步,答题卡的出现大大减轻教学工作者们批改试卷的工作量。
答题卡是光标阅读机输入信息的载体,是配套光标阅读机的各种信息录入表格的总称。
答题卡将用户需要的信息转化为可选择的选项,供用户涂写。
OMR是用光学扫描的方法来识别按一定格式印刷或书写的标记,并将其转换为计算机能接受的电信号的设备,并根据信息点的涂与未涂和格式文件设置将信息还原。
因此,如何将答题卡填涂的黑色区域识别出来并使用计算机进行处理是极为关键的。
本论文探索了有效识别答题卡的方法,以matlab为工具,基于数字图像处理技术对答题卡填涂区域进行了识别,并对识别的结果进行了处理,得到了结果。
本论文利用Hough变换的直线检测技术检测图像的倾斜度,判断图像是否倾斜,对存在倾斜的图像进行旋转校正。
最终实现答题卡答案的定位和检测。
论文使用像素统计方法进行识别,利用黑白颜色灰度值的巨大差异对二值图像的灰度值进行累加并进行阈值判定,识别错误效率极低,能够准确的识别答题卡的涂卡标记。
关键词:Hough变换,答题卡识别,matlab,一、设计任务、目的和要求本设计以matlab为工具利用数字图像处理技术对答题卡进行了识别,并对识别结果进行了处理。
注意到答题卡在采集图像的过程中由于各种原因可能会产生图像倾斜、水平或垂直错位,要进行正确识别首先必须对其进行校正,再依据像素检索技术进行识别。
二、总体方案设计说明系统运行环境,编程软件平台,编码算法原理,算法流程图设计本系统运行在当今主流的Windows7系统,使用较新的MATLAB2012b进行设计。
在进行旋转校正时,先使用Hough变换检测出答题卡边缘直线,调用lines函数的参数得到倾斜角度并进行旋转变换从而消除答题卡倾斜状态。
如何使用MATLAB进行模式识别与检测
如何使用MATLAB进行模式识别与检测MATLAB是一款强大的计算工具,它在模式识别与检测领域拥有广泛的应用。
本文将介绍如何使用MATLAB进行模式识别与检测的基本方法和技巧。
一、引言模式识别与检测是一门研究如何通过计算机识别和解释具有特定模式的数据的学科。
在实际应用中,我们常常需要通过对数据进行分析和处理,来发现其中的规律和模式,以实现自动识别和检测。
二、数据预处理数据预处理是模式识别与检测的第一步,它包括数据标准化、降维和特征提取等操作。
在MATLAB中,可以使用一系列函数和工具箱来实现这些操作。
1. 数据标准化数据标准化可以使得数据的均值为零,方差为一,从而使得不同特征具有相同的标度。
在MATLAB中,可以使用`zscore`函数来实现数据的标准化。
2. 降维降维是指将高维数据映射到低维空间,以减少数据的复杂性和提高计算效率。
常用的降维方法有主成分分析(PCA)和线性判别分析(LDA)。
在MATLAB中,可以使用`pca`和`lda`函数来进行降维操作。
3. 特征提取特征提取是从原始数据中提取出能够代表数据特点的特征。
常用的特征提取方法有傅里叶变换、小波变换和小波包变换等。
在MATLAB中,可以使用相应的函数和工具箱来实现特征提取。
三、模型建立与训练在进行模式识别与检测任务时,我们需要建立一个合适的模型并对其进行训练。
在MATLAB中,有多种模型可以选择,例如支持向量机(SVM),神经网络和决策树等。
1. 支持向量机(SVM)SVM是一种常用的模式识别与检测方法,它可以在高维空间中构造一个超平面,用于分类和回归。
在MATLAB中,可以使用`fitcsvm`函数来建立SVM模型,并使用`train`函数对模型进行训练。
2. 神经网络神经网络是一种模拟人脑神经元间连接方式的计算模型。
在MATLAB中,可以使用`patternnet`函数建立一个多层感知机(MLP)神经网络,并使用`train`函数对网络进行训练。
MATLAB手写识别课程设计
MATLAB手写识别课程设计一、课程目标知识目标:1. 掌握MATLAB编程基础,了解其在手写识别领域的应用;2. 学习并理解常见的手写识别算法原理,如神经网络、支持向量机等;3. 了解手写识别的数据预处理方法,如图像二值化、特征提取等。
技能目标:1. 能够运用MATLAB编写简单的手写识别程序,实现基本的手写数字识别;2. 学会使用MATLAB工具箱进行手写识别算法的仿真与优化;3. 能够对手写识别算法进行性能评估,分析识别效果。
情感态度价值观目标:1. 培养学生对人工智能领域的兴趣,激发探索精神;2. 培养学生的团队协作意识,学会与他人共同解决问题;3. 增强学生的实践能力,使其认识到理论知识在实际应用中的价值。
课程性质:本课程为实践性较强的课程,结合理论知识与实际操作,让学生在学习过程中充分了解手写识别技术的原理与应用。
学生特点:学生具备一定的编程基础,对MATLAB有所了解,对手写识别技术感兴趣。
教学要求:通过本课程的学习,使学生能够掌握手写识别的基本原理和方法,具备实际操作能力,为后续相关领域的研究或工作打下基础。
教学过程中,注重理论与实践相结合,以学生为主体,引导他们主动探究、解决问题。
最终通过课程目标的实现,提高学生的综合素质。
二、教学内容1. MATLAB编程基础:变量与数据类型、矩阵运算、流程控制、函数编写等;教材章节:第一章《MATLAB基础》2. 手写识别算法原理:a. 神经网络:多层感知器、反向传播算法;b. 支持向量机:最大间隔分类器、核函数;教材章节:第二章《手写识别算法》3. 数据预处理方法:a. 图像二值化:全局阈值法、局部阈值法;b. 特征提取:HOG特征、小波特征等;教材章节:第三章《图像预处理与特征提取》4. MATLAB手写识别程序编写:a. 数据集准备:手写数字数据集MNIST;b. 算法实现:基于神经网络的识别、基于支持向量机的识别;c. 性能评估:准确率、召回率、F1值等;教材章节:第四章《MATLAB手写识别编程实践》5. MATLAB工具箱应用:a. 神经网络工具箱:建立、训练和测试神经网络模型;b. 深度学习工具箱:搭建卷积神经网络进行手写识别;教材章节:第五章《MATLAB工具箱在手写识别中的应用》教学进度安排:共10课时,其中:1. MATLAB编程基础:2课时;2. 手写识别算法原理:3课时;3. 数据预处理方法:2课时;4. MATLAB手写识别程序编写:2课时;5. MATLAB工具箱应用:1课时。
字符识别matlab代码
字符识别matlab代码
在MATLAB中进行字符识别通常涉及使用图像处理和机器学习技术。
以下是一个简单的示例代码,用于使用MATLAB中的内置函数进行字符识别:
matlab.
% 读取图像。
I = imread('image.jpg');
% 将图像转换为灰度图像。
I_gray = rgb2gray(I);
% 进行图像增强和预处理。
I_processed = imbinarize(I_gray); % 二值化处理。
% 使用内置的OCR函数进行字符识别。
results = ocr(I_processed);
% 显示识别结果。
recognized_text = results.Text;
disp(recognized_text);
上述代码首先读取图像,然后将其转换为灰度图像。
接下来,
使用imbinarize函数进行二值化处理,以便更好地识别字符。
然后,使用内置的OCR函数进行字符识别,并将识别结果存储在results
变量中。
最后,将识别的文本显示出来。
需要注意的是,上述示例代码仅适用于简单的字符识别任务。
对于复杂的字符识别任务,可能需要使用更复杂的图像处理和机器
学习算法,例如卷积神经网络(CNN)等。
另外,还可以考虑使用MATLAB提供的深度学习工具箱来构建更复杂的字符识别模型。
总的来说,字符识别是一个复杂的问题,需要综合运用图像处
理和机器学习技术。
以上代码仅为简单示例,实际应用中可能需要
根据具体情况进行调整和优化。
matlab答题卡识别程序
clear allclose allwarning off allfilecounter=input(‘请输入开始的文件序号:’);students=(‘请输入文件数或学生数:’);classscore=[];path='C:\Users\MBENBEN\Desktop\2016年6月月考答题卡检测\195\IMG_20160618_';filetype=input(‘请输入文件类型:’,’s’);questiontotal=30;answer=[2,4,3,2,1,2,2,4,1,3,3,4,3,3,1,4,1,2,3,4,4 ,2,4,1,3,1,4,2,2,2];while filecounter<=studentsscore=0;filename=num2str(filecounter);file=strcat(path,filename,'.',filetype); answercounter=1;p=imread(file);f=rgb2gray(p);f1=im2bw(f,0.8);fvertical=~imrotate(f1,-90,'bicubic ');fvertical=fvertical(:,1:end-25);[biglong,bigwide]=size(fvertical);fdownprojection=sum(fvertical); fdownprojectionsmooth=smooth(fdownprojection,30); verticalfz=max(fdownprojectionsmooth)*9/10; fdownprojectionsmooth(fdownprojectionsmooth<=vert icalfz+1)=0;fdownprojectionsmooth(fdownprojectionsmooth>=vert icalfz-1)=100;plot(fdownprojectionsmooth) verticalruler=[];verticalrulercounter=1;while verticalrulercounter <bigwide;iffdownprojectionsmooth(verticalrulercounter)~=fdow nprojectionsmooth(verticalrulercounter+1) verticalruler=[verticalrulercounter,verticalruler ];endverticalrulercounter=verticalrulercounter +1;endverticalrulerarray=fvertical(:,verticalruler(2):v erticalruler(1));verticalprojection=sum(verticalrulerarray,2); verticalrulerfz=(max(verticalprojection)+min(vert icalprojection))/2;verticalprojection(verticalprojection<=verticalrulerfz+1)=0; verticalprojection(verticalprojection>=verticalrulerfz-1)=100; verticalcounter=1;verticalruler2=[];while verticalcounter<biglongif verticalprojection(verticalcounter)~= verticalprojection(verticalcounter+1)verticalruler2=[verticalruler2,verticalcounter]; endverticalcounter=verticalcounter+1;endrulerarray4=fvertical(verticalruler2(1):verticalr uler2(22),1:verticalruler(2)-40);rulerarray4level=sum(rulerarray4);rulerarray4smooth=smooth(rulerarray4level,30);plo t(rulerarray4smooth)rulerarray4fz=max(rulerarray4smooth)*2/3; rulerarray4smooth(rulerarray4smooth<=rulerarray4f z+1)=0;rulerarray4smooth(rulerarray4smooth>=rulerarray4f z-1)=100;ruler4=[];ruler4counter=1;[ruler4x,ruler4y]=size(rulerarray4);while ruler4counter<ruler4yifrulerarray4smooth(ruler4counter)~=rulerarray4smoo th(ruler4counter+1)ruler4=[ruler4,ruler4counter];elseruler4=ruler4;endruler4counter=ruler4counter+1;endrulerarray4wide=ruler4(end)-ruler4(1);ruler5=ruler4-rulerarray4wide;ruler6=[ruler5,ruler4];verticalruler3= [verticalruler2(29:98)];ruler3counter=1;r3=0;socre=[];while ruler3counter<70smalllineoption=fvertical(verticalruler3(ruler3co unter):verticalruler3(ruler3counter+1),:);r3=r3+1;if rem(r3,5)==0ruler3counter=ruler3counter+4;ruler3counter=ruler3counter+2;endoptioncounter6=1;smalloptionarray=[];while optioncounter6<5optionarray=smalllineoption(:,ruler6(optioncounte r6):ruler6(optioncounter6+1));optionvalue=mean2(optionarray);smalloptionarray=[smalloptionarray,optionvalue]; optioncounter6=optioncounter6+1;endrightoption=max(smalloptionarray);[optionm,goal,optionl]=find(smalloptionarray==rig htoption);if goal==answer(answercounter)score=score+1;elsescore=score;answercounter= answercounter+1;endstudentscore=filecounter*100+score;classscore=[classscore, studentscore];jdtleft1=ones(50,1000);jdtleft(:,:,1)=jdtleft1*255;jdtleft(:,:,2)=jdtleft1*0;jdtleft(:,:,3)=jdtleft1*0;jdtright(:,:,1)=jdtleft1*255;jdtright(:,:,2)=jdtleft1*255;jdtright(:,:,3)=jdtleft1*255;jdtred=jdtleft(:,1:1000*filecounter/students,:); jdtwhite=jdtright(:,1000*filecounter/students:100 0,:);jdt=[jdtred,jdtwhite];imshow(uint8(jdt)) filecounter=filecounter+1;endclassscore2=classscore';xlswrite('C:\Users\MBENBEN\Desktop\195.xlsx',clas sscore2,1,'a2');load gongsound(y,Fs)。
基于matlab的答题卡识别开题报告
5.整理毕业设计,查漏补缺,准备答辩。(2020.5.1~2020.5.20)
学生(签名):2019年12月28日
指导教师意见
指导教师(签名):2019年12月29日
2.主要内容、研究方法和思路
一、主要内容
(1)确定答题卡识别系统的整体方案,包括系统整体的框架以及硬件组成、软件开发方案,其中主要是软件方面的开发。
(2)确定数字图像处理的算法,包括图像预处理、图像的倾斜及旋转校正、二值化等。通过分析和比较多种处理方法,结合图像本身的一些特点最后确定使用Hough变换来检测图像中的直线的倾角,并通过旋转图像使图像进行矫正。
二国内外研究状况随着计算机技术的飞速发展阅卷系统也得到了成熟的发展国外是率先采用计算机技术自动阅卷系统81966年在美国的杜克大学ellis团队经过努力研发了第一个自动评分的系统叫peg他主要是针对文章的内在特征进行桔子意思的分析将文章的特征进行量化采用人工评估得分的方式给出结果从这些结果中找出一系列的特征进行训练得出一个与之相关的分析性值用这个值对待批阅的文章进行批阅9
二、本科毕业论文(设计)开题报告
1.研究(设计)目的意义及国内外研究状况和应用前景(附参考文献):
一、研究目的意义
在现代教育事业飞速发展的历程中,开始已经成为现代教育事业中最公平的方式方法,而且也是衡量教与学的唯一方法[1]。通过考试成绩的好与坏,老师和家长可以分析出学生掌握的知识多少和学习情况[2]。从而老师可以了解到自己教学中的不足来改进教学的方式方法,提高教学的水平[3]。学生也可以通过考试了解到自身学习的不足,从而有针对性的进行学习。考试也是进行人才的选拔和评价的重要方法,不论是找工作应聘,还是单位内部的晋升都需要考试[4]。
基于数字图像处理技术的答题卡识别方法(图像处理课程练习)
××大学2013-2014学年第二学期课程考核《图像处理》综合设计报告基于数字图像处理技术的答题卡识别方法学号姓名班级日期本人郑重声明:本人认真、独立完成了查找资料、编写程序、撰写报告等考核任务。
签字:日期:摘要背景:随着科技的发展,电子与计算机技术的进步,答题卡的出现大大减轻教学工作者们批改试卷的工作量。
答题卡是光标阅读机输入信息的载体,是配套光标阅读机的各种信息录入表格的总称。
答题卡将用户需要的信息转化为可选择的选项,供用户涂写。
OMR是用光学扫描的方法来识别按一定格式印刷或书写的标记,并将其转换为计算机能接受的电信号的设备,并根据信息点的涂与未涂和格式文件设置将信息还原。
因此,如何将答题卡填涂的黑色区域识别出来并使用计算机进行处理是极为关键的。
本论文探索了有效识别答题卡的方法,以matlab为工具,基于数字图像处理技术对答题卡填涂区域进行了识别,并对识别的结果进行了处理,得到了结果。
本论文利用Hough 变换的直线检测技术检测图像的倾斜度,判断图像是否倾斜,对存在倾斜的图像进行旋转校正。
最终实现答题卡答案的定位和检测。
论文使用像素统计方法进行识别,利用黑白颜色灰度值的巨大差异对二值图像的灰度值进行累加并进行阈值判定,识别错误效率极低,能够准确的识别答题卡的涂卡标记。
关键词:Hough变换,答题卡识别,matlab,一、设计任务、目的和要求本设计以matlab为工具利用数字图像处理技术对答题卡进行了识别,并对识别结果进行了处理。
注意到答题卡在采集图像的过程中由于各种原因可能会产生图像倾斜、水平或垂直错位,要进行正确识别首先必须对其进行校正,再依据像素检索技术进行识别。
二、总体方案设计说明系统运行环境,编程软件平台,编码算法原理,算法流程图设计本系统运行在当今主流的Windows7系统,使用较新的MATLAB2012b进行设计。
在进行旋转校正时,先使用Hough变换检测出答题卡边缘直线,调用lines函数的参数得到倾斜角度并进行旋转变换从而消除答题卡倾斜状态。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
clear all
close all
warning off all
filecounter=input(‘请输入开始的文件序号:’);
students=(‘请输入文件数或学生数:’);
classscore=[];
path='C:\Users\MBENBEN\Desktop\2016年6月月考答题卡检测\195\IMG_20160618_';
filetype=input(‘请输入文件类型:’,’s’);
questiontotal=30;
answer=[2,4,3,2,1,2,2,4,1,3,3,4,3,3,1,4,1,2,3,4,4 ,2,4,1,3,1,4,2,2,2];
while filecounter<=students
score=0;
filename=num2str(filecounter);
file=strcat(path,filename,'.',filetype); answercounter=1;
p=imread(file);
f=rgb2gray(p);
f1=im2bw(f,0.8);
fvertical=~imrotate(f1,-90,'bicubic ');
fvertical=fvertical(:,1:end-25);
[biglong,bigwide]=size(fvertical);
fdownprojection=sum(fvertical); fdownprojectionsmooth=smooth(fdownprojection,30); verticalfz=max(fdownprojectionsmooth)*9/10; fdownprojectionsmooth(fdownprojectionsmooth<=vert icalfz+1)=0;
fdownprojectionsmooth(fdownprojectionsmooth>=vert icalfz-1)=100;plot(fdownprojectionsmooth) verticalruler=[];
verticalrulercounter=1;
while verticalrulercounter <bigwide;
if
fdownprojectionsmooth(verticalrulercounter)~=fdow nprojectionsmooth(verticalrulercounter+1) verticalruler=[verticalrulercounter,verticalruler ];
end
verticalrulercounter=verticalrulercounter +1;
end
verticalrulerarray=fvertical(:,verticalruler(2):v erticalruler(1));
verticalprojection=sum(verticalrulerarray,2); verticalrulerfz=(max(verticalprojection)+min(vert icalprojection))/2;
verticalprojection
(verticalprojection<=verticalrulerfz+1)=0; verticalprojection
(verticalprojection>=verticalrulerfz-1)=100; verticalcounter=1;
verticalruler2=[];
while verticalcounter<biglong
if verticalprojection(verticalcounter)~= verticalprojection(verticalcounter+1)
verticalruler2=[verticalruler2,verticalcounter]; end
verticalcounter=verticalcounter+1;
end
rulerarray4=fvertical(verticalruler2(1):verticalr uler2(22),1:verticalruler(2)-40);
rulerarray4level=sum(rulerarray4);
rulerarray4smooth=smooth(rulerarray4level,30);plo t(rulerarray4smooth)
rulerarray4fz=max(rulerarray4smooth)*2/3; rulerarray4smooth(rulerarray4smooth<=rulerarray4f z+1)=0;
rulerarray4smooth(rulerarray4smooth>=rulerarray4f z-1)=100;
ruler4=[];
ruler4counter=1;
[ruler4x,ruler4y]=size(rulerarray4);
while ruler4counter<ruler4y
if
rulerarray4smooth(ruler4counter)~=rulerarray4smoo th(ruler4counter+1)
ruler4=[ruler4,ruler4counter];
else
ruler4=ruler4;
end
ruler4counter=ruler4counter+1;
end
rulerarray4wide=ruler4(end)-ruler4(1);
ruler5=ruler4-rulerarray4wide;
ruler6=[ruler5,ruler4];
verticalruler3= [verticalruler2(29:98)];
ruler3counter=1;
r3=0;
socre=[];
while ruler3counter<70
smalllineoption=fvertical(verticalruler3(ruler3co unter):verticalruler3(ruler3counter+1),:);
r3=r3+1;
if rem(r3,5)==0
ruler3counter=ruler3counter+4;
ruler3counter=ruler3counter+2;
end
optioncounter6=1;
smalloptionarray=[];
while optioncounter6<5
optionarray=smalllineoption(:,ruler6(optioncounte r6):ruler6(optioncounter6+1));
optionvalue=mean2(optionarray);
smalloptionarray=[smalloptionarray,optionvalue]; optioncounter6=optioncounter6+1;
end
rightoption=max(smalloptionarray);
[optionm,goal,optionl]=find(smalloptionarray==rig htoption);
if goal==answer(answercounter)
score=score+1;
else
score=score;
answercounter= answercounter+1;
end
studentscore=filecounter*100+score;
classscore=[classscore, studentscore];
jdtleft1=ones(50,1000);
jdtleft(:,:,1)=jdtleft1*255;
jdtleft(:,:,2)=jdtleft1*0;
jdtleft(:,:,3)=jdtleft1*0;
jdtright(:,:,1)=jdtleft1*255;
jdtright(:,:,2)=jdtleft1*255;
jdtright(:,:,3)=jdtleft1*255;
jdtred=jdtleft(:,1:1000*filecounter/students,:); jdtwhite=jdtright(:,1000*filecounter/students:100 0,:);
jdt=[jdtred,jdtwhite];imshow(uint8(jdt)) filecounter=filecounter+1;
end
classscore2=classscore';
xlswrite('C:\Users\MBENBEN\Desktop\195.xlsx',clas sscore2,1,'a2');
load gong
sound(y,Fs)。