基于OpenCV的KNN算法实现手写数字识别
基于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算法实现手写数字识别的更多相关文章
- KNN算法案例--手写数字识别
import numpy as np import matplotlib .pyplot as plt import pandas as pd from sklearn.neighbors impor ...
- C#中调用Matlab人工神经网络算法实现手写数字识别
手写数字识别实现 设计技术参数:通过由数字构成的图像,自动实现几个不同数字的识别,设计识别方法,有较高的识别率 关键字:二值化 投影 矩阵 目标定位 Matlab 手写数字图像识别简介: 手写 ...
- 使用AI算法进行手写数字识别
人工智能 人工智能(Artificial Intelligence,简称AI)一词最初是在1956年Dartmouth学会上提出的,从那以后,研究者们发展了众多理论和原理,人工智能的概念也随之扩展 ...
- KNN分类算法实现手写数字识别
需求: 利用一个手写数字“先验数据”集,使用knn算法来实现对手写数字的自动识别: 先验数据(训练数据)集: ♦数据维度比较大,样本数比较多. ♦ 数据集包括数字0-9的手写体. ♦每个数字大约有20 ...
- Python实现KNN算法及手写程序识别
1.Python实现KNN算法 输入:inX:与现有数据集(1xN)进行比较的向量 dataSet:已知向量的大小m数据集(NxM) 个标签:数据集标签(1xM矢量) k:用于比较的邻居数 ...
- 实验楼 1. k-近邻算法实现手写数字识别系统--《机器学习实战 》
首先看看一些关键词:K-NN算法,训练集,测试集,特征(空间),标签 举实验楼中的样例,通俗的讲讲K-NN算法:电影有两个分类(标签)-动作片-爱情片.两个特征--打斗场面--亲吻画面. 将那些数字和 ...
- KNN算法实现手写数字
from numpy import * import operator from os import listdir def classify0(inX, dataSet, labels, k): d ...
- CNN:人工智能之神经网络算法进阶优化,六种不同优化算法实现手写数字识别逐步提高,应用案例自动驾驶之捕捉并识别周围车牌号—Jason niu
import mnist_loader from network3 import Network from network3 import ConvPoolLayer, FullyConnectedL ...
- 一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!
1. 什么是KNN 1.1 KNN的通俗解释 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1 ...
随机推荐
- nginx内置高可用配置与第三方高可用模块nginx_ustream_check_mudule配置
1. nginx 第三方高可用模块 IP 备注 10.0.0.63 proxy 10.0.0.64 web1 10.0.0.65 web2 这里会讲解一些nignx常用高可用方案,以及引入第三方高可用 ...
- Kafka 2.5.0发布——弃用对Scala2.11的支持
近日Kafka发布了最新版本 2.5.0,增加了很多新功能: 下载地址:https://kafka.apache.org/downloads#2.5.0 对TLS 1.3的支持(默认为1.2) 引入用 ...
- 如何假装黑客,使用python去批量破解朋友的网站密码
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http ...
- 如何用python爬虫从爬取一章小说到爬取全站小说
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http ...
- Sprint 2 : ios图形界面设计与代码整合
这周我们主要focus在personal photo experience 项目的ios图形界面设计与代码整合工作上. 工作进度: 1. 图形界面设计方面:兆阳和敏龙基本已经将ios手机客户端的雏形界 ...
- 哈密顿绕行世界问题 HDU2181
题目大意都比较简单,用vector存一下图,然后爆搜就可以了. #include<bits/stdc++.h> using namespace std; ; vector<]; bo ...
- V - Largest Rectangle in a Histogram HDU - 1506
两种思路: 1 单调栈:维护一个单调非递减栈,当栈为空或者当前元素大于等于栈顶元素时就入栈,当前元素小于栈顶元素时就出栈,出栈的同时计算当前值,当前值所包含的区间范围为从当前栈顶元素到当前元素i的距离 ...
- 关于vue切换用户,路由表不更新问题
简介 我想很多同学在项目中可能会遇到类似的问题,然后一顿操作,发现结果不尽人意.于是查阅各种资料,走进很多坑(可能你阅读的这篇随笔也是个坑).接下来我所描述的是关于我使用不同权限的用户切换登陆后,需要 ...
- kioptrix靶机记录
靶机地址:172.16.1.193 Kali地址:172.16.1.107 首页为Apache测试页,没看到有价值信息 尝试目录扫描: 点击查看: http://172.16.1.193/index. ...
- 在.NET Core中用最原生的方式读取Nacos的配置
背景 之前老黄写过一篇<ASP.NET Core结合Nacos来完成配置管理和服务发现>简单介绍了如何让.NET Core程序接入Nacos,之前的SDK里面更多的是对Nacos的Open ...