基于OpenCV的KNN算法实现手写数字识别

一、数据预处理

# 导入所需模块
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 显示灰度图
def plt_show(img):
plt.imshow(img,cmap='gray')
plt.show()
# 加载数据集图片数据
digits = cv2.imread('./image/digits.png',0)
print(digits.shape)
plt_show(digits)
(1000, 2000)

# 划分数据
cells = [np.hsplit(row,100) for row in np.vsplit(digits,50)]
len(cells)
50
# 转换为numpy数组
x = np.array(cells)
x.shape
(50, 100, 20, 20)
plt_show(x[5][0])

# 生成训练数据标签和测试数据标签
k = np.arange(10)
train_label = np.repeat(k,250)
test_label = train_label.copy()
# 图片数据转换为特征矩阵,划分训练数据集
train = x[:,:50].reshape(-1,400).astype(np.float32)
# 图片数据转换为特征矩阵,划分测试数据集
test = x[:,50:100].reshape(-1,400).astype(np.float32)
test.shape
(2500, 400)

二、knn算法预测

# 生成模型
knn = cv2.ml.KNearest_create()
# 训练数据
knn.train(train,cv2.ml.ROW_SAMPLE,train_label)
True
# 传入n值,和测试数据,返回结果
ret,result,neighbours,dist = knn.findNearest(test, 3)
# 统计正确的个数
res = 0
for i in range(2500):
if result[i]==test_label[i]:
res = res+1
res
2439
# 计算模型准确率
accuracy = res/result.size
print('识别测试数据的准确率为:',accuracy)
识别测试数据的准确率为: 0.9756

三、导入图片预测

# 在测试集中随便找一张图片
test_image = test[2400].reshape(20,20)
plt_show(test_image)
test_label[2400]

# 将图片转换为特征矩阵
testImage = test[2400].reshape(-1,400).astype(np.float32)
testImage.shape
(1, 400)
# 使用训练好的模型预测
ret,result,neighbours,dist = knn.findNearest(testImage, 3)
# 预测结果
print('识别出的数字为:',result[0][0])
识别出的数字为: 9.0
# 传入一张自己找的图片进行识别尺寸(20*20)
te = cv2.imread('test2.jpg',0)
plt_show(te)
te.shape

(20, 20)

testImage = te.reshape(-1,400).astype(np.float32)
testImage.shape
(1, 400)
ret,result,neighbours,dist = knn.findNearest(testImage, 3)
result
array([[2.]], dtype=float32)
print('识别出的数字为:',result[0][0])
识别出的数字为: 2.0

用自己写的一张图片预测

# 用所有数据作为训练数据
knn = cv2.ml.KNearest_create()
k = np.arange(10)
labels = np.repeat(k,500)
knn.train(x.reshape(-1,400).astype(np.float32),cv2.ml.ROW_SAMPLE,labels)
True
te = cv2.imread('test1.jpg',0)
plt_show(te)
te.shape

(20, 20)

# 自适应阈值处理
ret, image = cv2.threshold(te, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY_INV)
plt_show(image)

# 将图片转换为特征矩阵
testImage = image.reshape(-1,400).astype(np.float32)
testImage.shape
(1, 400)
# 使用训练好的模型预测
ret,result,neighbours,dist = knn.findNearest(testImage, 3)
neighbours
array([[5., 5., 5.]], dtype=float32)
print('识别出的数字为:',result[0][0])
识别出的数字为: 5.0

资源地址:

链接:https://pan.baidu.com/s/1sUgKBvex43-Yf-Ul2DQSIA

提取码:t1sd

视频地址:https://www.bilibili.com/video/BV14A411t7tk/

基于OpenCV的KNN算法实现手写数字识别的更多相关文章

  1. KNN算法案例--手写数字识别

    import numpy as np import matplotlib .pyplot as plt import pandas as pd from sklearn.neighbors impor ...

  2. C#中调用Matlab人工神经网络算法实现手写数字识别

    手写数字识别实现 设计技术参数:通过由数字构成的图像,自动实现几个不同数字的识别,设计识别方法,有较高的识别率 关键字:二值化  投影  矩阵  目标定位  Matlab 手写数字图像识别简介: 手写 ...

  3. 使用AI算法进行手写数字识别

    人工智能   人工智能(Artificial Intelligence,简称AI)一词最初是在1956年Dartmouth学会上提出的,从那以后,研究者们发展了众多理论和原理,人工智能的概念也随之扩展 ...

  4. KNN分类算法实现手写数字识别

    需求: 利用一个手写数字“先验数据”集,使用knn算法来实现对手写数字的自动识别: 先验数据(训练数据)集: ♦数据维度比较大,样本数比较多. ♦ 数据集包括数字0-9的手写体. ♦每个数字大约有20 ...

  5. Python实现KNN算法及手写程序识别

    1.Python实现KNN算法 输入:inX:与现有数据集(1xN)进行比较的向量   dataSet:已知向量的大小m数据集(NxM)   个标签:数据集标签(1xM矢量)   k:用于比较的邻居数 ...

  6. 实验楼 1. k-近邻算法实现手写数字识别系统--《机器学习实战 》

    首先看看一些关键词:K-NN算法,训练集,测试集,特征(空间),标签 举实验楼中的样例,通俗的讲讲K-NN算法:电影有两个分类(标签)-动作片-爱情片.两个特征--打斗场面--亲吻画面. 将那些数字和 ...

  7. KNN算法实现手写数字

    from numpy import * import operator from os import listdir def classify0(inX, dataSet, labels, k): d ...

  8. CNN:人工智能之神经网络算法进阶优化,六种不同优化算法实现手写数字识别逐步提高,应用案例自动驾驶之捕捉并识别周围车牌号—Jason niu

    import mnist_loader from network3 import Network from network3 import ConvPoolLayer, FullyConnectedL ...

  9. 一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!

    1. 什么是KNN 1.1 KNN的通俗解释 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1 ...

随机推荐

  1. Spring(DI,AOP) 理解(一)

    感觉自己的spring理解的不好.所以重新开始学习. 这篇文章主要是来理解DI(依赖注入),Aop(切面) 一.DI(依赖注入,这里没有涉及到注释.只是用xml文件和Bean的方法来注册pojo,) ...

  2. 国外的一个代码 仓库 github --- 里面类似一个svn 的代码仓库

    https://github.com/wzhanke/shell 用户:wzh.e 邮箱:wzh.e@x.com 登陆密码:*wzh.e8*9

  3. bat批处理文件搞定所有系统问题

     bat批处理文件搞定所有系统问题  分类: WINDOWS   -----------bat批处理文件搞定所有系统问题---------   一.查漏补缺——给系统功能添把火  我们的操作系统虽然功 ...

  4. 数据结构和算法(Golang实现)(1)简单入门Golang-前言

    数据结构和算法在计算机科学里,有非常重要的地位.此系列文章尝试使用 Golang 编程语言来实现各种数据结构和算法,并且适当进行算法分析. 我们会先简单学习一下Golang,然后进入计算机程序世界的第 ...

  5. 数据结构和算法(Golang实现)(27)查找算法-二叉查找树

    二叉查找树 二叉查找树,又叫二叉排序树,二叉搜索树,是一种有特定规则的二叉树,定义如下: 它是一颗二叉树,或者是空树. 左子树所有节点的值都小于它的根节点,右子树所有节点的值都大于它的根节点. 左右子 ...

  6. 如何从零开始学Python?会玩游戏就行,在玩的过程就能掌握编程

    现在学习编程的人很多,尤其是python编程,都列入高考了,而且因为人工智能时代的到来,编程也将是一门越来越重要的技能. 但是怎么从零开始学python比较好呢?其实,你会玩游戏就行. 从零基础开始教 ...

  7. I. 蚂蚁上树

    蚂蚁上树(Sauteed Vermicelli with minced Pork),又名肉末粉条,是四川省及重庆市的特色传统名菜之一.因肉末贴在粉丝上,形似蚂蚁爬在树枝上而得名.这道菜具体的历史,已不 ...

  8. Cucumber(4)——jenkins的集成

    目录 回顾 必备知识 集成方法 回顾 在上几节中,关于cucumber的知识我已经全部的介绍完了,但是近期,jenkins大行其道,在工作上面能为我们节省大量的时间. 所以在本节中,我会介绍cucum ...

  9. Springboot:整合Mybaits和Druid【监控】(十一)

    MyBatis默认提供了一个数据库连接池PooledDataSource,在此我们使用阿里提供的Druid数据库连接池 项目下载:https://files.cnblogs.com/files/app ...

  10. 第十二章Linux文件系统与日志

    1.inode 包含文件的元信息(1)inode 内容:文件的字节数.拥有者的 UID.GID.文件的读写执行权限.时间戳等,但不包含文件名.文件名是储存在目录的目录项中.(2)查看文件的 inode ...