基于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 ...
随机推荐
- not found 什么时候触发
eq: BEGIN DECLARE EXIT HANDLER FOR NOT FOUND SET o_state = 999; select count(1) into ...
- 开源运动的"圣经"——《大教堂与集市》读书笔记
作者:Eric S. Raymond 一.黑客圈简史 1.早期 (1)MIT 与 ITS "黑客"一词大约就起源于MIT的计算机文化. 从PDP-1时代开始,黑客文化的命运就和DE ...
- Android MonkeyTalk测试
Android MonkeyTalk测试 MonkeyTalk可以用于压力测试,正因为这点所以才选择MonkeyTalk进行测试,相对于Monkey测试,目前个人发现的有点在于,MonkeyTalk是 ...
- 【JAVA】并发-基础IO
一.java.io包支持.java的IO流有输入.输出两种,每种输入.输出流又可分为字节流.字符流两大类,字节流以字节为单位处理IO操作,字符流以字符为单位处理IO操作 JDK 1.4以后有java. ...
- 装机摸鱼日记01--DDR3AMD专用内存+QHQF(6400T)试水
前些日子在某鱼入手了两条AMD专用内存,宏想的DDR3-1600MHz-8G内存和一块高贵阿苏斯Z170-P-D3主板,然后某宝600多买了一颗QHQF(当然也可以玩QHQJ,更便宜,估计三百多),准 ...
- UML(续)
活动图 活动图定义 活动图描述了在一个过程中,顺序的/并行的活动及其之间的关系 应用于商业过程.工作流(业务过程).复杂算法的建模 活动图是顶点和弧的集合 活动节点 动作 流 对象值 注解和约束等 建 ...
- 简单的中国MOOC大学列表提取 - Python
有些时候我们想知道网页中包含哪些具体的信息,比如如下的这个网页, http://www.icourse163.org/university/view/all.htm 我们只想知道自己的学校是否在这个列 ...
- jmeter并发时生成唯一变量
vars.put("partnerOrderId","ZS"+Thread.currentThread().getId()+System.currentTime ...
- python 基础篇 模块化
在做项目的时候,虽然你不可能把全世界的代码都放到一个文件夹下,但是类似模块化的思想还是要有的--那就是以项目的根目录作为最基本的目录,所有的模块调用,都要通过根目录一层层向下索引的方式来 import ...
- Vue 3.0 Composition API - 中文翻译
Composition API 发布转载请附原文链接 https://www.cnblogs.com/zgh-blog/articles/composition_api.html 这两天初步了解了下 ...