模板匹配算法(手写数字识别)
研一的课程结束了,抓住暑假最后的尾巴,将模式识别与机器学习课程上的作业整理出来,当做是一次复习。
模板匹配
模板是已知的、带标签的,将未知的样本和所有模板进行匹配,计算相似度。相似度如何计算呢,我们的研究对象是图像,可以计算图像和模板特征向量之间的距离(欧式距离)。
作业要求为:使用模板匹配对手写数字,和车牌数字进行识别。数据集提供大家参考(提取码:roz1)
思路也挺简单的:
- 首先是做模板,将10个数字做成模板,定义一个函数将二维数组的图像展平为一纬数组,将十个模板存放在一个list中。需要对手写数字和车牌数字两种字体识别,所以需要做分别做模板
- 计算相似度用的是欧式距离,定义一个函数计算欧式距离
- 将待识别的图像分别和模型计算欧式距离,取最小距离的模型数字为识别结果
import numpy as np
import cv2#展平二维图像
def vector(data):h,w = data.shape[0:2]img_pixel = np.asarray(data).reshape(1,h*w)return img_pixel#制作手写数字模板
def write_template():temple_list = []for i in range(0,10):path_tem = './课程数据集/手写数字/{}/'.format(i)img = cv2.imdecode(np.fromfile(path_tem+'2.bmp',np.uint8), cv2.IMREAD_GRAYSCALE)img_resize = cv2.resize(img, (250,250))tem_pixel = vector(img_resize)temple_list.append(tem_pixel)return temple_list#制作车牌数字模板
def car_template():template_list2 = []for i in range(0,10):path_tem2 ='./课程数据集/车牌/{}.bmp'.format(i)img = cv2.imdecode(np.fromfile(path_tem2,np.uint8),cv2.IMREAD_GRAYSCALE)img_resize = cv2.resize(img,(250,250))tem_pixel = vector(img_resize)template_list2.append(tem_pixel)return template_list2#计算欧式距离
def Euclidean_distance(x,y):tem = np.array(x).astype(np.float32)sam = np.array(y).astype((np.float32))num2 = np.square(tem-sam)return np.sqrt(np.sum(num2))#template matching
if __name__ =="__main__":print('\n用手写体模板匹配\n')print('手写体数字匹配\n')template_list = write_template()number_list = []correct_num = 0for index in range(0,10):path_write = './课程数据集/手写数字/{}/'.format(index)sam_img = cv2.imdecode(np.fromfile(path_write + '5.bmp',np.uint8),cv2.IMREAD_GRAYSCALE)sam_resize = cv2.resize(sam_img,(250,250))sam_pixel = vector(sam_resize)ture_num = indexnumber_list.append(index)#cal the Euclidean distancedistance_list = []for tem in template_list:distance = Euclidean_distance(tem,sam_pixel)distance_list.append(distance)#cal the shortest distanceshort_dis = min(distance_list)short_index =distance_list.index(min(distance_list))if int(ture_num) == short_index:correct_num += 1print('数字{}到模板的最短距离为:{},匹配到的类别为:{}\n'.format(ture_num,short_dis,short_index))distance_list.clear()n = len(number_list)print('共测试了{}个样本,正确匹配的个数为:{}'.format(n,correct_num))print('\n车牌数字匹配\n')car_num_list = []car_correct_num = 0for index in range(0,10):path_tem = './课程数据集/车牌/{}.1.bmp'.format(index)img_car_pic = cv2.imdecode(np.fromfile(path_tem,np.uint8),cv2.IMREAD_GRAYSCALE)img_car_pic_resize = cv2.resize(img_car_pic,(250,250))img_car_pixel = vector(img_car_pic_resize)car_ture_num = indexcar_num_list.append(index)#cal the Euclidean distancecar_distance_list =[]for tem in template_list:car_distance = Euclidean_distance(tem,img_car_pixel)car_distance_list.append(car_distance)short_car_dis = min(car_distance_list)short_car_index = car_distance_list.index(min(car_distance_list))if int(car_ture_num) == int(short_car_index):car_correct_num +=1print('数字{}到模板的最短距离为:{},匹配到的类别为:{}\n'.format(car_ture_num,short_car_dis,short_car_index))car_distance_list.clear()m = len(car_num_list)print('共测试了{}个样本,正确匹配的个数为:{}'.format(m,car_correct_num))print('\n用车牌模板匹配\n')print('手写体数字匹配\n')template_list = car_template()number_list = []correct_num = 0for index in range(0,10):path_write = './课程数据集/手写数字/{}/'.format(index)sam_img = cv2.imdecode(np.fromfile(path_write + '5.bmp',np.uint8),cv2.IMREAD_GRAYSCALE)sam_resize = cv2.resize(sam_img,(250,250))sam_pixel = vector(sam_resize)ture_num = indexnumber_list.append(index)#cal the Euclidean distancedistance_list = []for tem in template_list:distance = Euclidean_distance(tem,sam_pixel)distance_list.append(distance)#cal the shortest distanceshort_dis = min(distance_list)short_index =distance_list.index(min(distance_list))if int(ture_num) == short_index:correct_num += 1print('数字{}到模板的最短距离为:{},匹配到的类别为:{}\n'.format(ture_num,short_dis,short_index))distance_list.clear()n = len(number_list)print('共测试了{}个样本,正确匹配的个数为:{}'.format(n,correct_num))print('\n车牌数字匹配\n')car_num_list = []car_correct_num = 0for index in range(0,10):path_tem = './课程数据集/车牌/{}.1.bmp'.format(index)img_car_pic = cv2.imdecode(np.fromfile(path_tem,np.uint8),cv2.IMREAD_GRAYSCALE)img_car_pic_resize = cv2.resize(img_car_pic,(250,250))img_car_pixel = vector(img_car_pic_resize)car_ture_num = indexcar_num_list.append(index)#cal the Euclidean distancecar_distance_list =[]for tem in template_list:car_distance = Euclidean_distance(tem,img_car_pixel)car_distance_list.append(car_distance)short_car_dis = min(car_distance_list)short_car_index = car_distance_list.index(min(car_distance_list))if int(car_ture_num) == int(short_car_index):car_correct_num +=1print('数字{}到模板的最短距离为:{},匹配到的类别为:{}\n'.format(car_ture_num,short_car_dis,short_car_index))car_distance_list.clear()m = len(car_num_list)print('共测试了{}个样本,正确匹配的个数为:{}'.format(m,car_correct_num))
以下内容为补充
模板匹配是图像处理的一个基础算法,在图像A中寻找到与图像B(模板)最相似的区域,opencv有相应的函数调用 cv.matchTemplate(img,template,参数)。函数不同参数的具体效果可以看看中文文档模板匹配 (apachecn.org),有趣的是cv.TM_CCOEFF_NORMED参数可以在一张图像上匹配多个对象。
模板匹配算法(手写数字识别)相关推荐
- python opencv数字识别_基于模板匹配的手写数字识别(python+opencv)
智能计算课第一周的实验是做基于模板匹配的手写数字识别,光听见就很感兴趣,于是决定认真做做这个实验,本实验基于python3+opencv的python版本,所用到的知识都比较简单,基本上边学边做,技术 ...
- 学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec...
人工神经网络,借鉴生物神经网络工作原理数学模型. 由n个输入特征得出与输入特征几乎相同的n个结果,训练隐藏层得到意想不到信息.信息检索领域,模型训练合理排序模型,输入特征,文档质量.文档点击历史.文档 ...
- 机器学习笔记——从手写数字识别开始
文章目录 前言 关于这篇博客(预计八月下旬全部完成) 关于项目实现 监督学习 ANN全连接神经网络的实现 1.总述 2.初始化 3.传播及损失 4.反向传播 决策树以及随机森林的实现 1.总述 2.单 ...
- MNIST数据集手写数字识别
1 数据集介绍 MNIST 包括6万张28x28的训练样本,1万张测试样本,很多教程都会对它"下手"几乎成为一个 "典范",可以说它就是计算机视觉里面的Hell ...
- 基于TensorFlow深度学习框架,运用python搭建LeNet-5卷积神经网络模型和mnist手写数字识别数据集,设计一个手写数字识别软件。
本软件是基于TensorFlow深度学习框架,运用LeNet-5卷积神经网络模型和mnist手写数字识别数据集所设计的手写数字识别软件. 具体实现如下: 1.读入数据:运用TensorFlow深度学习 ...
- 手写数字识别画板前后端实现 | Flask+深度神经网络
1. 系统概要 手写数字识别画板系统,按照MVC原则开发,主要由两部分组成:交互界面(视图View)部分是传统的HTML +CSS+JS网页(这同样也是一种遵循MVC开发方式):手写数字识别部分(模型 ...
- 实验四 手写数字识别的神经网络算法设计与实现
实验四 手写数字识别的神经网络算法设计与实现 一.实验目的 通过学习BP神经网络技术,对手写数字进行识别,基于结构的识别法及模板匹配法来提高识别率. 二.实验器材 PC机 matlab软件 三.实验内 ...
- 【人工智能实验】运用贝叶斯决策理论实现手写数字识别
目录 实验二 运用贝叶斯决策理论实现手写数字识别 一.实验目的 二.实验原理 1.分类器原理 2.实现手写数字识别算法原理 三.实验结果 四.实验总结 1.实验流程 2.分析不同模板对于实验结果的影响 ...
- 【人工智能实验】卷积神经网络CNN框架的实现与应用-手写数字识别
目录 实验六 卷积神经网络CNN框架的实现与应用 一.实验目的 二.实验原理 三.实验结果 1.调整学习率.epochs以及bacth_size这三个参数,分别观察参数的变化对于实验结果的影响. 2. ...
- 模式识别 实验四 手写数字识别的神经网络算法设计与实现
实验四 手写数字识别的神经网络算法设计与实现 一.实验目的 通过学习BP神经网络技术,对手写数字进行识别,基于结构的识别法及模板匹配法来提高识别率. 二.实验器材 PC机 matlab软件 三.实验内 ...
最新文章
- RUP within the context of the Six Best Practices
- 人工智能之机器学习算法体系汇总
- 搜索引擎solr和elasticsearch
- 基本粒子群算法(PSO)的改进
- 携程发布2021年一季度财报:净利润环比增长近80% 达18亿元人民币
- number输入框限制输入数字位数、字体随数字长度变化
- java游戏西门大官人_valueOf()方法的使用
- Gnome2.30 GDM圖片風格設置方式
- GeoTools——JTS空间操作
- Sqlserver 索引
- gdb 调试打印完整字符串
- linux session存储目录,Linux session(会话)
- VX线报机器人的使用
- Photoshop插件-删除亮调通道蒙板-脚本开发-PS插件
- win7计算机怎么初始化,Win7系统网络初始化的设置方法
- 由于找不到vcruntime140_1.dll,无法继续执行代码
- 计算机键盘功能教案,键盘认识教案
- win7 删除网络计算机,win7系统删除网络共享中多余的计算机的操作方法
- html5 自动触发事件,HTML5视频触发事件触发一次
- 科沃斯机器人招股_603486_科沃斯招股说明书.pdf