研一的课程结束了,抓住暑假最后的尾巴,将模式识别与机器学习课程上的作业整理出来,当做是一次复习。

来自我b导的图

模板匹配

模板是已知的、带标签的,将未知的样本和所有模板进行匹配,计算相似度。相似度如何计算呢,我们的研究对象是图像,可以计算图像和模板特征向量之间的距离(欧式距离)。

作业要求为:使用模板匹配对手写数字,和车牌数字进行识别。数据集提供大家参考(提取码:roz1)

思路也挺简单的:

  1. 首先是做模板,将10个数字做成模板,定义一个函数将二维数组的图像展平为一纬数组,将十个模板存放在一个list中。需要对手写数字和车牌数字两种字体识别,所以需要做分别做模板
  2. 计算相似度用的是欧式距离,定义一个函数计算欧式距离
  3. 将待识别的图像分别和模型计算欧式距离,取最小距离的模型数字为识别结果
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参数可以在一张图像上匹配多个对象。

模板匹配算法(手写数字识别)相关推荐

  1. python opencv数字识别_基于模板匹配的手写数字识别(python+opencv)

    智能计算课第一周的实验是做基于模板匹配的手写数字识别,光听见就很感兴趣,于是决定认真做做这个实验,本实验基于python3+opencv的python版本,所用到的知识都比较简单,基本上边学边做,技术 ...

  2. 学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec...

    人工神经网络,借鉴生物神经网络工作原理数学模型. 由n个输入特征得出与输入特征几乎相同的n个结果,训练隐藏层得到意想不到信息.信息检索领域,模型训练合理排序模型,输入特征,文档质量.文档点击历史.文档 ...

  3. 机器学习笔记——从手写数字识别开始

    文章目录 前言 关于这篇博客(预计八月下旬全部完成) 关于项目实现 监督学习 ANN全连接神经网络的实现 1.总述 2.初始化 3.传播及损失 4.反向传播 决策树以及随机森林的实现 1.总述 2.单 ...

  4. MNIST数据集手写数字识别

    1 数据集介绍 MNIST 包括6万张28x28的训练样本,1万张测试样本,很多教程都会对它"下手"几乎成为一个 "典范",可以说它就是计算机视觉里面的Hell ...

  5. 基于TensorFlow深度学习框架,运用python搭建LeNet-5卷积神经网络模型和mnist手写数字识别数据集,设计一个手写数字识别软件。

    本软件是基于TensorFlow深度学习框架,运用LeNet-5卷积神经网络模型和mnist手写数字识别数据集所设计的手写数字识别软件. 具体实现如下: 1.读入数据:运用TensorFlow深度学习 ...

  6. 手写数字识别画板前后端实现 | Flask+深度神经网络

    1. 系统概要 手写数字识别画板系统,按照MVC原则开发,主要由两部分组成:交互界面(视图View)部分是传统的HTML +CSS+JS网页(这同样也是一种遵循MVC开发方式):手写数字识别部分(模型 ...

  7. 实验四 手写数字识别的神经网络算法设计与实现

    实验四 手写数字识别的神经网络算法设计与实现 一.实验目的 通过学习BP神经网络技术,对手写数字进行识别,基于结构的识别法及模板匹配法来提高识别率. 二.实验器材 PC机 matlab软件 三.实验内 ...

  8. 【人工智能实验】运用贝叶斯决策理论实现手写数字识别

    目录 实验二 运用贝叶斯决策理论实现手写数字识别 一.实验目的 二.实验原理 1.分类器原理 2.实现手写数字识别算法原理 三.实验结果 四.实验总结 1.实验流程 2.分析不同模板对于实验结果的影响 ...

  9. 【人工智能实验】卷积神经网络CNN框架的实现与应用-手写数字识别

    目录 实验六 卷积神经网络CNN框架的实现与应用 一.实验目的 二.实验原理 三.实验结果 1.调整学习率.epochs以及bacth_size这三个参数,分别观察参数的变化对于实验结果的影响. 2. ...

  10. 模式识别 实验四 手写数字识别的神经网络算法设计与实现

    实验四 手写数字识别的神经网络算法设计与实现 一.实验目的 通过学习BP神经网络技术,对手写数字进行识别,基于结构的识别法及模板匹配法来提高识别率. 二.实验器材 PC机 matlab软件 三.实验内 ...

最新文章

  1. RUP within the context of the Six Best Practices
  2. 人工智能之机器学习算法体系汇总
  3. 搜索引擎solr和elasticsearch
  4. 基本粒子群算法(PSO)的改进
  5. 携程发布2021年一季度财报:净利润环比增长近80% 达18亿元人民币
  6. number输入框限制输入数字位数、字体随数字长度变化
  7. java游戏西门大官人_valueOf()方法的使用
  8. Gnome2.30 GDM圖片風格設置方式
  9. GeoTools——JTS空间操作
  10. Sqlserver 索引
  11. gdb 调试打印完整字符串
  12. linux session存储目录,Linux session(会话)
  13. VX线报机器人的使用
  14. Photoshop插件-删除亮调通道蒙板-脚本开发-PS插件
  15. win7计算机怎么初始化,Win7系统网络初始化的设置方法
  16. 由于找不到vcruntime140_1.dll,无法继续执行代码
  17. 计算机键盘功能教案,键盘认识教案
  18. win7 删除网络计算机,win7系统删除网络共享中多余的计算机的操作方法
  19. html5 自动触发事件,HTML5视频触发事件触发一次
  20. 科沃斯机器人招股_603486_科沃斯招股说明书.pdf

热门文章

  1. 美国 SOPA 法案简介
  2. 解析手机游戏制胜10大关键因素
  3. 如何查软件静默安装参数
  4. 微信小程序开发之大转盘 仿天猫超市抽奖
  5. 可以检测手机帧率和温度的软件_没有特异功能 手机软件是如何测得电池温度的...
  6. 【网单服务端】奇迹EX802完美转生端+真实格斗大师+新地图+新技能+新装备一键端服务端
  7. 景联文科技提供一站式智能安防数据采集标注解决方案
  8. Flac3D常用命令部分
  9. 零基础学python知乎-python学画画(上)
  10. 基于XLINX的PWM控制LED模块设计