目录

一.案例:手写数字的识别

1.安装opencv-python库

2.将大图分割成100×50个小图,每份对应一个手写数字样品

3.训练集和测试集

4.为训练集和测试集准备结果标签

5.模型训练与预测

6.计算准确率

7.完整代码实现


一.案例:手写数字的识别

现有一张2000×1000像素的手写数字照片digits.png作为数据集,如下共有100列50行,由此我们可以计算出一个手写数字的大小是20×20像素

1.安装opencv-python库

安装opencv-python库指令(可以根据自己的需要指定版本)如下:

pip install opencv-python==3.4.11.45 -i Https://pypi.tuna.tsinghua.edu.cn/simple

上面的digits.png图片是彩色图像,由RGB三个通道叠加而成,所以它的本质是三维矩阵

我们需要利用opencv-python这个库的imread()方法来读取图片数据

然后用cv2.cvtColor(img,COLOR_BGR2GRAY)将其转换为灰度图,灰度图仅保留亮度信息转化为二维矩阵,无彩色通道数据更简化

import numpy as np
import cv2
img = cv2.imread('digits.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

2.将大图分割成100×50个小图,每份对应一个手写数字样品

先利用numpy的vsplit()方法,将大图在垂直方向上分割成50行

再利用hsplit()方法把分割后的每一行在水平方向上切成100列

这样就得到了50×100个手写数字列表

cells = [ np.hsplit(row,100) for row in np.vsplit(gray,50)]

再用numpy库的array()方法将列表转化成矩阵,提升处理效率

data = np.array(cells)

3.训练集和测试集

为了训练和测试的准确性我们将全部数据的前50列作为训练集,后50列作为测试集

train=data[:,:50]
test=data[:,50:]

训练的数据都是一行数据代表一个样本,前面我们知道一个手写数字大小是20×20像素,所以我们可以将矩阵reshape为(-1,400)的样式,这样一行就是一个手写数字的400个特征,训练集和测试集各有2500行

数据类型也得从 uint8(0-255整数)转为 float32,以支持KNN算法中的距离计算(含小数)

train_new=train.reshape(-1,400).astype(np.float32)
test_new=test.reshape(-1,400).astype(np.float32)

4.为训练集和测试集准备结果标签

用numpy库中的arange()方法,生成0到9的数字序列,由于测试集和训练集中每个数字都各有250个即他们的特征数据都各有250行,所以我们再用repeat()方法将数字序列重复250次

k=np.arange(0,10)
labels=np.repeat(k,250)

再将标签labels通过np.newaxis 转为二维列向量(2500×1),与特征数据对齐

train_labels = labels[:,np.newaxis]
test_labels = labels[:,np.newaxis]

5.模型训练与预测

优先使用OpenCV内置算法(如KNN)以减少依赖库数量,提升运行效率

使用OpenCV库的KNN算法:

通过 cv2.ml.KNearest_create()创建v模型,在通过train()方法传入训练数据(特征矩阵和标签),train()方法中的参数 cv2.ml.ROW_SAMPLE 表示指定每行为一个样本数据

knn = cv2.ml.KNearest_create()
knn.train(train_new,cv2.ml.ROW_SAMPLE,train_labels)

使用findNearest()方法完成对测试集的预测并指定K值

返回结果result中存放预测的结果

ret,result,neighbors,dist=knn.findNearest(test_new,k=3)

6.计算准确率

由于OpenCV库的KNN算法中没有计算准确率的方法所以我们需要自己计算

通过result==test_labels,预测结果与标签相同则放回True反之返回False,最后返回一个只有True和False的序列

通过np.count_nonzero()方法来计算一共有多少个True

最后直接用True的个数除以总共的个数即为准确率

matches = result==test_labels
correct=np.count_nonzero(matches)
accuracy=correct*100.0/result.size
print("识别手写数字的准确率为{}%".format(accuracy))

7.完整代码实现

import numpy as np
import cv2
img = cv2.imread('digits.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cells = [ np.hsplit(row,100) for row in np.vsplit(gray,50)]
data = np.array(cells)train=data[:,:50]
test=data[:,50:]train_new=train.reshape(-1,400).astype(np.float32)
test_new=test.reshape(-1,400).astype(np.float32)k=np.arange(0,10)
labels=np.repeat(k,250)
train_labels = labels[:,np.newaxis]
test_labels = labels[:,np.newaxis]knn = cv2.ml.KNearest_create()
knn.train(train_new,cv2.ml.ROW_SAMPLE,train_labels)
ret,result,neighbors,dist=knn.findNearest(test_new,k=3)matches = result==test_labels
correct=np.count_nonzero(matches)
accuracy=correct*100.0/result.size
print("识别手写数字的准确率为{}%".format(accuracy))

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP/IP 传输层详解

TCP/IP 传输层详解 传输层(Transport Layer)是 TCP/IP 模型的第四层(对应 OSI 模型的传输层),核心功能是实现 端到端(进程到进程)的可靠通信。主要协议包括: TCP(传输控制…

深度学习笔记:Overview

本文根据吴恩达老师的深度学习课程整理而来,在此表示感知。 文章目录1.课程笔记2.编程作业1.课程笔记 1)深度学习笔记(1):神经网络基础 2)深度学习笔记(2):浅层神经网络…

LLM之RAG理论(十八)| ChatGPT DeepResearch 深度研究功能全面技术分析报告

一、背景与行业环境1.1 DeepResearch 的诞生与战略意义ChatGPT DeepResearch(深度研究)是 OpenAI 于 2025 年 2 月 3 日正式发布的全新 AI 智能体产品,是继 o3-mini 模型发布后,OpenAI 在 AI 研究领域的又一重大突破。这一功能的推…

数据库学习--------数据库日志类型及其与事务特性的关系

在数据库系统中,日志是保证数据可靠性和一致性的重要组成部分,尤其与事务的特性紧密相连。无论是事务的原子性、一致性,还是持久性,都离不开日志的支持。数据库日志(Database Log)是数据库系统记录自身操作…

如何在 Ubuntu 24.04 或 22.04 LTS 上安装 OpenShot 视频编辑器

OpenShot 视频编辑器是一款轻量级工具,不需要高性能硬件即可编辑视频。它最初是一个爱好项目,后来成为一款拥有简单干净用户界面的流行免费编辑工具。这款直观的视频编辑器可以剪辑影片,并添加额外的视频和音频素材。最终,您可以将作品导出为您选择的格式。本教程将向您展示…

SpringMVC核心原理与实战指南

什么是MVC? MVC英文是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计规范。 MVC是用一种业务逻辑、数据、界面显示分离的方法,将业务逻辑聚集到一个部件里面&am…

【JavaEE】(7) 网络原理 TCP/IP 协议

一、应用层 应用层是程序员最关心的一层,需要自定义数据传输的格式,即前(客户端)后(服务器)端交互的接口,然后调用传输层的 socket api 来实现网络通信。 自定义数据传输的协议,主要…

深入理解 Slab / Buddy 分配器与 MMU 映射机制

📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》 🎥 更多学习视频请关注 B 站:嵌入式Jerry 深入理解 Slab / Buddy 分配器与 MMU 映射机制 在现代 Linux 内核中,物理内存的管理和虚拟地址的映射是系统性能…

Layui核心语法快速入门指南

Layui 基本语法学习指南 Layui 是一个经典的模块化前端框架,以其轻量易用、组件丰富著称。以下是 Layui 的核心语法结构和使用方法: 一、模块加载机制(核心基础) // 标准模块加载语法 layui.use([module1, module2], function()…

基于百度 iframe 框架与语音解析服务的数字人交互系统实现

在智能化交互场景中,数字人作为人机交互的重要载体,其语音交互能力与指令响应效率直接影响用户体验。本文将详细介绍如何基于百度提供的 iframe 框架与语音解析服务,实现数字人语音播报、文字展示及指令响应的完整业务流程,涵盖从插件初始化到实时语音交互的全链路实现逻辑…

高防服务器租用的优势有哪些?

高防服务器具有着强大的防护能力,可以帮助企业抵御各种网络攻击,其中包括大规模的DDOS攻击,高防服务器中还有着防火墙、流量清洗和负载均衡等多种安全技术,能够保证业务持续稳定的运行,降低了企业整体的损失和安全风险…

7.28 进制交换|迭代器模式|map|子集按位或|带参递归

lc701.二叉搜索树插入void dfs不行TreeNode* dfs,带接受参数处理的dfs当为空的时候,就可以添加插入if (!root){return new TreeNode(val);}插入位置root->left insertIntoBST(root->left, val);class Solution {public:TreeNode* insertIntoBST(T…

方法学习(二)

.一、变量作为实参使用:1.定义一个方法,比较两个整数的大小,如果第一个整数比第二个整数大,返回true否则返回false。public static void main(String[] args) {int i 3;int j 5;//传递的是i和j,但是真正传递的是i和j…

计算机视觉CS231n学习(1)

面向视觉识别的卷积神经网络 CS231n Introduction计算机视觉的历史 the history of computer vision 重要节点:1959 Hubel & Wiesel 利用和人比较相像的猫的视觉神经做实验:简单细胞反应灯的位置;复杂细胞反应灯的位置和移动;…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博内容IP地图可视化分析实现

大家好,我是java1234_小锋老师,最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程,持续更新中,计划月底更新完,感谢支持。今天讲解微博内容IP地图可视化分析实现 视频在线地…

Z20K118库中寄存器及其库函数封装-SYSCTRL库

1. 系统设备识别寄存器(SCM)7个位域。 记录设备信息。Z20K11x[FAM_ID:Z20K/Z20M,SUBF_ID:1/3,SER_ID:1/4]特征ID版本号FLASH存储器大小封装类型。1-1 SYSCTRL_DeviceId_t SYSCTRL_GetDeviceId(void)读取设备信息。2.独一ID号寄存器(SCM)4个该寄存器存储完…

007TG洞察:波场TRON上市观察,Web3流量工具的技术解析与应用

引言:波场TRON(TRX)登陆资本市场及近期加密市场热点(如MEME币),凸显了实时流量捕获与转化在Web3领域的战略地位。对于技术团队而言,构建支撑全球业务的Web3平台,核心挑战在于&#x…

STM32——HAL 库MDK工程创建

总:STM32——学习总纲 参考工程: 实验0-3,新建工程实验-HAL库版本 前置知识: STM32——HAL库 一、HAL 库 MDK工程新建步骤简介 例: 各个文件夹内容: 1.1 Drivers 1.2 Middlewares 1.3 Output 1.4 Pro…

【图像处理】霍夫变换:霍夫变换原理、霍夫空间、霍夫直线、霍夫圆详解与代码示例

霍夫变换详解与代码示例 霍夫变换(Hough Transform)是一种用于检测图像中几何形状(如直线、圆)的特征提取技术。其核心思想是将图像空间中的点映射到参数空间(霍夫空间),通过累积投票机制识别形…

Java WEB技术-序列化和反序列化认识(SpringBoot的Jackson序列化行为?如何打破序列化过程的驼峰规则?如何解决学序列化循环引用问题?)

一、什么是序列化和反序列化 在java项目中,对象序列化和反序列化通常用于对象的存储或网络传输等。如:服务端创建一个JSON对象,对象如何在网络中进行传输呢?我们知道网络传输的数据通常都是字节流的形式,对象想要在网络…