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

一、数据预处理

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

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

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

二、knn算法预测

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

三、导入图片预测

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

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

(20, 20)

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

用自己写的一张图片预测

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

(20, 20)

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

  1. # 将图片转换为特征矩阵
  2. testImage = image.reshape(-1,400).astype(np.float32)
  3. testImage.shape
  1. (1, 400)
  1. # 使用训练好的模型预测
  2. ret,result,neighbours,dist = knn.findNearest(testImage, 3)
  1. neighbours
  1. array([[5., 5., 5.]], dtype=float32)
  1. print('识别出的数字为:',result[0][0])
  1. 识别出的数字为: 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 singleton实例中的变量怎么保证线程安全

    pring中管理的bean实例默认情况下是单例的[sigleton类型],就还有prototype类型按其作用域来讲有sigleton,prototype,request,session,global ...

  2. 2020年iOS进阶面试题总结(一)

    准备找工作的你,可以看看,复习复习!! 1.说一下OC的反射机制 在动态运行下我们可以构建任何一个类,然后我们通过这个类知道这个类的所有的属性和方法,并且如果我们创建一个对象,我们也可以通过对象找到这 ...

  3. CORS漏洞的学习与分析

    同源策略 同源策略(Same origin policy)是一种约定,一种非常重要的安全措施,也是最基本的安全功能,它禁止了来自不同源的脚本对当前页面的读取或修改,从而限制了跨域访问甚至修改资源,防止 ...

  4. ORCAD常用元件库说明

    以下是ORCAD自带库文件的说明,路径:Cadence\Cadence_SPB_16.6\tools\capture\library 1' AMPLIFIER.OLB共182个零件,存放模拟放大器IC ...

  5. stand up meeting 12-10

    今天项目会议正好利用了大家上课前的十五分钟,大家对项目进度和项目中所遇到的问题进行了沟通. 由于天赋同学与重阳小组沟通及时有效,在mapping的过程中直接将单词本中的type与我们单词挑战中的que ...

  6. Berry Jam codeforces 1278C

    题目大意: 有两种类型的果酱,一个梯子,从中间开始吃,可以吃左边的,也可以吃右边的,最终要使两种类型的果酱的数量想等 题解: 思路对了,但是没考虑完. 对梯子的左侧的果酱I我们用两个数组记录其从1到i ...

  7. Reward 杭电 2647

    Problem Description Dandelion's uncle is a boss of a factory. As the spring festival is coming , he ...

  8. C++ 11 +,开坑。

    最近换新工作了.工作中需要用到高端的c++11的一些操作,至于我后面又plus一下还是因为可能是c++14或者17中提供的一些操作.反正都是c++11以及之后的一些特性. 首先,今天看一下关于函数模板 ...

  9. python3爬虫 爬取动漫视频

    起因 因为本人家里有时候网速不行,所以看动漫的时候播放器总是一卡一卡的,看的太难受了.闲暇无聊又F12看看.但是动漫网站却无法打开控制台.这就勾起了我的兴趣.正好反正无事,去寻找下视频源. 但是这里事 ...

  10. [Laravel框架学习一]:Laravel框架的安装以及 Composer的安装

    1.先下载Composer-Setup.exe,下载地址:下载Composer .会自动搜索PHP.exe的安装路径,如果没有,就手动找到php路径下的php.exe. 2.在PHP目录下,打开php ...