KNN图像识别实例--手写数字识别

news2024/11/24 3:03:29

目录

前言

一、导入库

二、导入图像并处理

1.导入图像

2.提取出图像中的数字

3.将列表转换成数组

4.获取特征数据集

5.获取标签数据

三、使用KNN模型

1.创建KNN模型并训练

2.KNN模型出厂前测试

3.使用测试集对KNN模型进行测试

四、传入单个图像,使用该模型进行识别

1.导入图像

2.处理成灰度图

3.获取数据并转换成数组

4.将数据变成KNN模型可使用的维度

5.进行图像识别

总结


前言


本次图像识别所用的图片

点击链接下载保存图片即可使用

这是图像:

一、导入库

  • python图像识别需要用cv2库
import numpy as np
import cv2

二、导入图像并处理

1.导入图像

# 导入图像
img = cv2.imread('figure_0_9.png')
# 将图像处理成灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

2.提取出图像中的数字

  • 在画图工具或者pycharm里可以看见这个图像是2000*1000像素的
  • 每个数字大小都是20*20
# 提取出图像里的数字 这里是等分的
cells = [np.hsplit(row, 100) for row in np.vsplit(gray, 50)]  # vsplit 垂直切分; hsplit 水平切分

3.将列表转换成数组

# 将列表转换成数组
x = np.array(cells)
print(x.shape)  # 打印x的各维度大小  (50, 100, 20, 20)

4.获取特征数据集

  • 分离出训练集train 和测试集test
  • 这里使用图片左一半数据做训练,右一半数据做测试
# 分出训练集train 和测试集test
train = x[:, :50]
test = x[:, 50:100]
print(train.shape)       # (50, 50, 20, 20)

# 更改各数据集的维度 变成一个数字一行数据
train_new = train.reshape(-1, 400).astype(np.float32)  # 将第二个维度大小设置成400,第一个维度根据原数据维度自动进行判断
test_new = test.reshape(-1, 400).astype(np.float32)  # 将数组的数据类型转换为 np.float32
print(train_new.shape)    # (2500, 400)

5.获取标签数据集

  • 这里标签数据集自己做出来
# 给各数据集分配标签
k = range(10)
labels = np.repeat(k, 250)  # 将每一个数字重复250次 变成2500行
train_labels = labels[:, np.newaxis]  # 给labels增加一个维度
test_labels = np.repeat(k, 250)[:, np.newaxis]  # 省略写法

三、使用KNN模型

1.创建KNN模型并训练

  • 这里是使用cv2创建KNN模型
# 创建模型并进行训练
knn = cv2.ml.KNearest_create()  # 使用cv2 创建knn模型
knn.train(train_new, cv2.ml.ROW_SAMPLE, train_labels)  # 传入训练集特征数据和标签进行训练
# cv2.ml.ROW_SAMPLE 指示数据是按行排列的 OpenCV 的机器学习模块中的 ROW_SAMPLE 常量用于指明每一行表示一个训练样本

2.KNN模型出厂前测试

# 获取使用KNN识别手写数字模型出厂前测试准确率
ret, result, neighbours, dist = knn.findNearest(train_new, k=3)  # 先使用训练集数据进行出厂前测试
# print(result)
matcher = result == train_labels  # 取出判断之后的布尔值
correct = np.count_nonzero(matcher)  # 统计判断正确的数量
accuracy = correct * 100.0 / result.size  # 计算准确率
print("使用KNN识别手写数字模型出厂前测试准确率为:", accuracy)
# 使用KNN识别手写数字模型出厂前测试准确率为: 96.92

3.使用测试集对KNN模型进行测试

  • 与上面代码差别在,knn.findNearest中的数据集参数和matcher里使用的result以及标签集参数
# 获取当前使用KNN识别手写数字的准确率
ret, result, neighbours, dist = knn.findNearest(test_new, k=3)
matcher = result == test_labels  # 取出判断之后的布尔值
correct = np.count_nonzero(matcher)  # 统计判断正确的数量
accuracy = correct * 100.0 / result.size  # 计算准确率
print("当前使用KNN识别手写数字的准确率为:", accuracy)
# 当前使用KNN识别手写数字的准确率为: 91.64

四、传入单个图像,使用该模型进行识别

  • 所使用的库在最开始统一导入过了

图像:

  • 用的是20*20像素的,所以看起来很小        

1.导入图像

img_one = cv2.imread('test000.png')  # 导入图像

2.处理成灰度图

gray_one = cv2.cvtColor(img_one,cv2.COLOR_BGR2GRAY)  # 变成灰度图

3.获取数据并转换成数组

  • 因为这里使用的是单个图像,数据直接转换成数组即可
cells = np.array(gray_one)   # 获取数据 转换成数组
print(cells.shape)           # 查看数组维度 (20, 20)

4.将数据变成KNN模型可使用的维度

text_one = cells.reshape(-1,400).astype(np.float32)   # 将数据变成knn模型可使用的维度
print(text_one.shape)           # (1, 400)

5.进行图像识别

ret,result,neighbours,dist = knn.findNearest(text_one,k=11)
print(result)  # [[0.]] 输入图片为0 识别结果为0 识别成功

总结

KNN图像识别步骤:

1.导入所需库

2.导入图像并处理成数据 

        这是个难点,这次使用的数据是工整数据所以还没感觉到,但是在机器学习里获取数据集占一大部分的工作量

3.获取特征数据集

4.获取标签数据集

5.创建KNN模型并训练

6.进行测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2046117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

叉车高位盲区显示器 无线摄像头免打孔 视线遮挡的解决方案

叉车作业货叉叉货时,货叉升降无法看清位置,特别是仓储的堆高车,司机把头探出去才勉强可以靠经验找准方位!一个不小心就可能叉歪了,使货物倾斜、跌落等等,从而发生事故!如何将隐患扼杀&#xff0…

【JAVA入门】Day21 - 时间类

【JAVA入门】Day21 - 时间类 文章目录 【JAVA入门】Day21 - 时间类一、JDK7前的时间相关类1.1 Date1.2 SimpleDateFormat1.3 Calendar 二、JDK8新增的时间相关类2.1 Date 相关类2.1.1 ZoneId 时区2.1.2 Instant 时间戳2.1.3 ZoneDateTime 带时区的时间 2.2 DateTimeFormat 相关…

刷题DAY7

三个数的排序 题目:输入三个整数x,y,z,请把这三个数由小到大输出 输入:输入数据包含3个整数x,y,z,分别用逗号隔开 输出:输出由小到大排序后的结果,用空格隔…

O2OA开发知识-后端代理/接口脚本编写也能像前端一样用上debugger

在o2oa开发平台中,后端代理或者接口的脚本编写也能像前端一样用上debugger,这是来自藕粉社区用户的宝贵技术支持。 感谢藕粉社区论坛用户提供的技术分享!tzengsh_BTstthttps://www.o2oa.net/forum/space-uid-4410.html 论坛地址&#xff1a…

【Kubernetes】k8s集群图形化管理工具之rancher

目录 一.Rancher概述 1.Rancher简介 2.Rancher与k8s的关系及区别 3.Rancher具有的优势 二.Rancher的安装部署 1.实验准备 2.安装 rancher 3.rancher的浏览器使用 一.Rancher概述 1.Rancher简介 Rancher 是一个开源的企业级多集群 Kubernetes 管理平台,实…

2024年高教社杯数学建模国赛A题思路解析+代码+论文

2024年高教社杯全国大学生数学建模竞赛(以下简称国赛)将于9月5日晚6时正式开始。 下文包含:2024国赛思路解析​、国赛参赛时间及规则信息说明、好用的数模技巧及如何备战数学建模竞赛 C君将会第一时间发布选题建议、所有题目的思路解析、相…

Axure:引领智慧时代的数据可视化原型设计先锋

在数字化转型的浪潮中,智慧农业、智慧城市、智慧社区、智慧水务等概念如雨后春笋般涌现,它们不仅重塑了我们的生活空间,也对数据可视化提出了前所未有的要求。作为原型设计领域的佼佼者,Axure RP凭借其强大的交互设计能力和直观的…

关于Nachi机器人自动运行上电条件

Nachi 机器人有两种控制柜,分别为 FD 控制柜和 CFD 控制柜。 对于 FD 控制器,执行以下操作。 1.旋转控制柜钥匙,使其对准标注位置①。 2.旋转示教器旋钮至下图所示位置。然后依次单击绿色按钮与白色按钮,机器人上电运行。 对于…

2025大数据毕业设计/计算机毕业设计创新必过选题(建议收藏)

一、大数据题目 项目架构模式: 1、数据Python爬虫:selenium、requests、DrissionPage等爬虫框架 2、hadoop、Spark、Flink(PyFlink)数据分析【可vmvare虚拟机可windwos电脑】 3、springboot、vue.js前后分离构建系统主体 4、…

排序篇——递归实现快速排序(hoare版-挖坑法-前后指针版)

目录 前言 一、key? 二、思路及代码实现 1.hoare版 2.挖坑法 3.前后指针版本 总结 前言 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法。它会选出一个基准值(key),把它放到正确的位置(排序之后的位置)。 提示:以下是本篇…

c语言学习,tolower ()函数分析

1:tolower() 函数说明: 检查参数c,为大写字母返回对应的小写字母 2:函数原型: int toascii(int c) 3:函数参数: 参数c,为检测整数 4:返回值: 返回转换的小…

【Python】生成二维迷宫的算法

前言 哈里最近因为一个小插曲打算写一个设计迷宫的算法。为了锻炼脑力,特地没有上网搜索而是自己摸索出一个迷宫设计算法。 概述 1、需求 哈里准备实现下图的迷宫。 2、分析 可以看到,图里凡是x和y坐标为单数时,总是白色。于是哈里得到下…

二分查找专题(总)

1、经典二分查找模板 int search(vector<int>& nums, int target) {int right nums.size() - 1;int left 0;while(left < right){int mid (left right)/2;if(nums[mid] > target){right mid-1;}else if(nums[mid] < target){left mid1;}else {return…

c语言-经典例题

C语言-经典例题 一、单项选择题 1、 -- A 2、 -- C y<5 --是关系运算符的优先级大于&& -- 是逻辑运算符 3、 -- B - D选项&#xff1a;c是float类型&#xff0c;所以c/2是1.5 4、 -- C 从后往前执行&#xff08;先算后面的&a…

【uniapp】vue3+vite配置tailwindcss

安装 npm install autoprefixer tailwindcss uni-helper/vite-plugin-uni-tailwind -Dautoprefixer &#xff1a;自动管理浏览器前缀的插件&#xff0c;可以解析css文件并且添加前缀到css内容里。uni-helper/vite-plugin-uni-tailwind: 将 Tailwind CSS 框架集成到使用 Vite 作…

linux系统编程:多任务编程(进程1)

1.进程 进程:(进行中的程序)--正在运行的程序 (动态的) ---内存 程序的一次执行过程&#xff01; 一个程序一个程序 可以 对应多个进程 程序 -- a.out (可执行程序) ---静态的 程序 加载 到内存 运行起来 成为了 进程。 进程是 程序运行的实体。 程序 数据代码 2.进…

背包九讲(求方案数,求具体方案数,有依赖背包)

文章目录 求方案数基本思路代码 背包问题求具体方案基本思路代码 有依赖背包基本思路代码 求方案数 问题描述&#xff1a; 给定n nn个物品&#xff0c;以及一个容量大小为m mm的背包&#xff0c;然后给出n nn个物品的体积及价值&#xff0c;求背包最大价值是多少&#xff0c;也…

递归排序 归并排序 快排

递归 求中点 midL(R-L)/2 midL((R-L)>>1)右移一位更快 子问题等量 mast er公式 T(N) a*T(N/b)O(N^d) T(N):母 T(N/b)&#xff1a;子 &#xff08;是否等量&#xff09; a&#xff1a;调用多少次 O(N^d)&#xff1a;除去子变量之外的时间复杂度 子问题等量 上面…

sqli-labs-master靶场通关

目录 一、sqli-labs第一关 1.判断是否存在sql注入 &#xff08;1&#xff09;提示输入数字值的ID作为参数&#xff0c;输入?id1 &#xff08;2&#xff09;通过数字值不同返回的内容也不同&#xff0c;所以我们输入的内容是带入到数据库里面查询了 &#xff08;3&#xff0…

信号量和管道

一、信号量 实现模拟售票问题&#xff1a; 1、信号量的机制&#xff1a;描述可使用资源的个数。 &#xff08;1&#xff09;P操作&#xff1a;表示使用这个资源&#xff0c;资源个数减一 逻辑&#xff1a;尝试获取资源——有资源可用直接使用 | 无资源可用等待 如果信号量的…