KNN算法-opencv的运用

news2024/9/23 23:35:05

文章目录

    • opencv介绍与安装
    • KNN算法中opencv的运用
      • 1.数据介绍
      • 2.图片处理
      • 3.图像切分与重组
      • 4.分配标签
      • 5.模型构建与训练
      • 6.预测结果
      • 7.模拟测试
      • 8.代码及详注

opencv介绍与安装

OpenCV(Open Source Computer Vision Library,开源计算机视觉库)是一个跨平台的计算机视觉库,它主要关注实时的图像处理和计算机视觉任务。OpenCV由Intel在1999年发起,并由Willow Garage和其他贡献者继续维护。现在,OpenCV已经发展成为一个功能强大、易于使用的库,广泛应用于图像处理、视频分析、机器学习、物体检测、人脸识别、运动跟踪等领域。

opencv-python是OpenCV的Python接口,它允许Python开发者使用OpenCV的强大功能。opencv-python通过Python的pip包管理工具可以轻松安装,使得Python程序员能够方便地在Python程序中调用OpenCV的函数和类,进行图像处理和计算机视觉相关的开发。

在Python环境中安装opencv-python非常简单,只需要使用pip命令即可:

pip install opencv-python

KNN算法中opencv的运用

1.数据介绍

这里我们通过运用opencv来实现一个简单的图像数字识别,这里我们选取一张像素为1000*2000,行为50,列为100的图像来识别,具体如下图:
在这里插入图片描述

2.图片处理

这里我们需要将图片进行初步处理,即图片读取与灰度图转换,读取图片的步骤是图像处理和分析的基础,它允许程序访问和操作图像的像素数据。灰度图转换的步骤通常用于图像预处理,因为它简化了图像,去除了颜色信息,使得后续的图像处理任务(如边缘检测、特征提取、图像分割等)更加容易和高效。

import cv2
import numpy as np

img = cv2.imread('digits.png') 
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cells = [np.hsplit(row, 100) for row in np.vsplit(gray, 50)]

3.图像切分与重组

将所得灰度图按照垂直轴分割成50份,再沿水平轴切分100份,这样我们就得到了大小为2020的5000份独立的数字,并将数据装入array,再将所得数据按照比例1:1分为训练集与测试集, 将数据构造为符合KNN的输入,将每个数字的尺寸由2020调整为1*400

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

x = np.array(cells)

train = x[:, :50] 
test = x[:, 50:100]

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

4.分配标签

创建一个包含0~9的数组,并将数组的每一个元素重复250次,通过使用np.newaxis,在labels数组上增加了一个新的维度,将原本形状为(2500,)的一维数组转换为了形状为(2500, 1)的二维数组。

k = np.arange(10)
labels = np.repeat(k, 250)
train_labels = labels[:, np.newaxis] 
test_labels = np.repeat(k, 250)[:, np.newaxis]

5.模型构建与训练

通过cv2.ml.KNearest_create()函数创建一个KNN模型的实例,通过knn.train()方法来训练模型,每个测试数据集中的每个样本都被预测为其最近的3个邻居中多数所属的类别。

knn = cv2.ml.KNearest_create() 
knn.train(train_new, cv2.ml.ROW_SAMPLE, train_labels)
ret, result, neighbours, dist = knn.findNearest(test_new, k=3)

6.预测结果

通过比较KNN模型预测的类别标签索引(result)与真实的测试标签(test_labels)是否相等,然后计算数据中非0的个数与总数的比重来计算模型的准确率。

matches = result == test_labels  
correct = np.count_nonzero(matches) 
accuracy = correct * 100.0 / result.size  
print("当前使用KNN识别手写数字的准确率为:", accuracy)

这里最终的得到的准确率结果为91.64%

7.模拟测试

这里我们又手动添加了两个数字来进行检验,查看最终得出结果是否与所写数字结果一致,来判断准确性。这里我们添加了数字3和9进行检验。
在这里插入图片描述

在这里插入图片描述

img_9 = cv2.imread('9.png')
img_3 = cv2.imread('3.png')
gray1 = cv2.cvtColor(img_9, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img_3, cv2.COLOR_BGR2GRAY)
x1 = np.array(gray1)
x2 = np.array(gray2)
test_9 = x1.reshape(-1, 400).astype(np.float32)
test_3 = x2.reshape(-1, 400).astype(np.float32)
ret1, result1, neighbours1, dist1 = knn.findNearest(test_9, k=3)
ret2, result2, neighbours2, dist2 = knn.findNearest(test_3, k=3)
print(result1, "\n", result2)
#输出结果:
[[1.]] 
 [[3.]]

这里结果输出为1和3,其中数字9检验出现问题,证明准确性确实存在一定问题。(注意:该两组图片大小均为20*20,所有不需要切分。)

8.代码及详注

import cv2
import numpy as np

img = cv2.imread('digits.png')  # 读取图片
img_9 = cv2.imread('9.png')
img_3 = cv2.imread('3.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 灰度图转换
gray1 = cv2.cvtColor(img_9, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img_3, cv2.COLOR_BGR2GRAY)

# 将数据划分成独立的数字,每个数字大小20*20,共计5000个
cells = [np.hsplit(row, 100) for row in np.vsplit(gray, 50)]

# 将数据装进array,形状(50,100,20,20),50行,50列,图像大小20*20
x = np.array(cells)
x1 = np.array(gray1)
x2 = np.array(gray2)

train = x[:, :50]  # 划分训练集与测试集,比例各一半
test = x[:, 50:100]
# 将数据构造为符合KNN的输入,将每个数字的尺寸由20*20调整为1*400
train_new = train.reshape(-1, 400).astype(np.float32)
test_new = test.reshape(-1, 400).astype(np.float32)
test_9 = x1.reshape(-1, 400).astype(np.float32)
test_3 = x2.reshape(-1, 400).astype(np.float32)

# 分配标签:分别为训练数据、测试数据分配标签
k = np.arange(10)
labels = np.repeat(k, 250)  # 重复数组中的元素,每个元素重复250次
train_labels = labels[:, np.newaxis]  # np.newaxis是Numpy库中的一个特殊对象,用于在数组中增加一个新的维度
test_labels = np.repeat(k, 250)[:, np.newaxis]

# 模型构建+训练
knn = cv2.ml.KNearest_create()  # 通过cv2创建一个knn模型
knn.train(train_new, cv2.ml.ROW_SAMPLE, train_labels)
ret, result, neighbours, dist = knn.findNearest(test_new, k=3)
ret1, result1, neighbours1, dist1 = knn.findNearest(test_9, k=3)
ret2, result2, neighbours2, dist2 = knn.findNearest(test_3, k=3)
# ret:表示查找是否成功。
# result:浮点数数组,表示测试样本的预测标签。
# neighbours:这是一个整数数组,表示与测试样本最近的k个邻居的索引,这些索引对应于训练集中的样本,可以用来检查哪些训练样本对预测结果产生了影响。
# dist:浮点数数组,表示测试样本与每个最近邻居之间的距离,这些距离可以帮助理解预测结果的置信度:距离越近,预测通常越可靠。
print(result1, "\n", result2)

# 通过比较KNN模型预测的类别标签索引(result)与真实的测试标签(test_labels)来计算模型的准确率。
matches = result == test_labels  # 判断标签索引(result)与真实的测试标签(test_labels)是否相等
correct = np.count_nonzero(matches)  # 数取matches中非0的个数
accuracy = correct * 100.0 / result.size  # 通过计算非0个数与总数的比值得出准确率
print("当前使用KNN识别手写数字的准确率为:", accuracy)

本代码通过opencv来建立KNN模型来训练算法,并通过比较类别标签索引(result)与真实的测试标签(test_labels)来计算模型的准确率。最终得到准确率为91.64,虽然简单直观,但通过调整k值能获取不同的准确率,选取不恰当时可能会造成较大影响。

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

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

相关文章

ShareSDK Twitter

创建应用 1.登录Twitter控制台并通过认证 2.点击Developer Portal进入Twitter后台 3.点击Sign up for Free Account创建应用 4.配置应用信息 以下为创建过程示例,图中信息仅为示例,创建时请按照真实信息填写,否则无法正常使用。 权限申请…

智能安全守护,寺庙安全用电解决方案

在四川省蓬溪县城北,高峰山以其千年的历史沉淀和独特的文化风貌,默默诉说着道教与佛教交融的传奇。然而,2017年5月31日凌晨的一声巨响,打破了这里的宁静,一场突如其来的大火,让这座承载着无数信徒信仰与梦想…

10步搞定Python爬虫从零到精通!

学习Python网络爬虫可以分为以下几个步骤,每一步都包括必要的细节和示例代码,以帮助你从零开始掌握这一技能。 第一步:理解网络爬虫基础 什么是网络爬虫? 网络爬虫是一种自动化程序,用来从互联网上收集数据.它通过发送 HTTP 请求…

大学生科创项目在线管理系统的设计与实现

TOC springboot267大学生科创项目在线管理系统的设计与实现 第1章 绪论 1.1选题动因 当前的网络技术,软件技术等都具备成熟的理论基础,市场上也出现各种技术开发的软件,这些软件都被用于各个领域,包括生活和工作的领域。随着电…

爬虫案例4——爬取房天下数据

简介:个人学习分享,如有错误,欢迎批评指正 任务:从房天下网中爬取小区名称、地址、价格和联系电话 目标网页地址:https://newhouse.fang.com/house/s/ 一、思路和过程 目标网页具体内容如下: ​​​​ …

揭秘面试必备:高频算法与面试题全面解析

干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…

Web安全:SqlMap工具

一、简介 sqlmap 是一款开源的渗透测试工具,可以自动化进行SQL注入的检测、利用,并能接管数据库服务器。它具有功能强大的检测引擎,为渗透测试人员提供了许多专业的功能并且可以进行组合,其中包括数据库指纹识别、数据读取和访问底层文件系统…

SystemUI手势操作隐藏显示导航栏

在Android 12中,通过SystemUI手势操作来隐藏和显示导航栏主要涉及对系统UI的定制和编程控制。以下是一些实现这一功能的方法: 第一类. 使用WindowInsetsController Android 12引入了一个新的WindowInsetsController类,它允许开发者更好地控…

加速科技精彩亮相2024中国(深圳)集成电路峰会

8月16日,2024中国(深圳)集成电路峰会(简称“ICS2024峰会”)在深圳如期开展,为行业带来一场技术盛宴。在这场盛会中,加速科技携2款核心产品——ST2500EX、ST2500E重磅亮相,凭借领先的…

【leetcode详解】特殊数组II : 一题代表了一类问题(前缀和思想)

前缀和的优势 给定一个数组,前缀和的特点在于,任意给出一对始末位置,能够用O(1)的时间复杂度得到始末位置之间所有元素的某种关系。 题型分析 这道题目正是“给出始末位置,检测其中元素特点”那一类,那我们就想&#…

【机器学习西瓜书学习笔记——概率图模型】

机器学习西瓜书学习笔记【第十四章】 第十四章 概率图模型概率图模型分类14.1 隐马尔可夫模型贝叶斯网络马尔科夫链隐马尔科夫模型 14.2 马尔可夫随机场( M R F MRF MRF)马尔可夫场定理算法原理概率推理参数学习算法对比 14.3 条件随机场( C R F CRF CRF)优缺点优点缺点 链式条…

Redis -LFU(Least Frequently Used,最少使用频率)缓存淘汰算法

在 Redis 的 LFU(Least Frequently Used,最少使用频率)缓存淘汰算法中,lru 字段被拆分成两部分:高 16 位存储 ldt(Last Decrement Time),低 8 位存储 logc(Logistic Coun…

【图像特效系列】卡通特效的实践 | 包含代码和效果图

目录 一 卡通特效 代码 效果图 图像特效系列主要是对输入的图像进行处理,生成指定特效效果的图片。图像素描特效会将图像的边界都凸显出来;图像怀旧特效是指图像经历岁月的昏暗效果;图像光照特效是指图像存在一个类似于灯光的光晕特效,图像像素值围绕光照中心点呈圆形范…

【就业】中国铁路人才招聘

中国国家铁路集团有限公司,是中国财政部直接出资的大型国有企业,与国资委直接管理的央企不同,它是由财政部代表国务院履行出资人职责 ,由中央管理的国有独资公司。其前身是由国家铁道部政企分离后剥离出来的全民所有制企业&#x…

Docker 基础—— 数据卷

1.数据卷 容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便,例如: 如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了? …

idea安装二进制文本阅读插件

引言 在软件开发过程中,有时需要查看二进制文件的内容以调试或分析问题。虽然有许多专用工具可以处理这类任务,但直接在 IDE 内集成这些功能无疑更加方便高效。本文将介绍如何在 IntelliJ IDEA 2023中安装和配置一个名为 BinEd的插件,以及如…

Python实验-选择结构

实验目的 (1)掌握条件语句中逻辑表达式的正确书写规则 (2)掌握单分支、双分支和多分之条件语句的使用方法 实验内容 1.某校三好学生的评定标准为:语文和数学两科的平均成绩大于90,且每科成绩不低于85分&…

人工智能系统测试生命周期详解之测试分析

前面的文章里我们已经整体介绍过了人工智能测试的生命周期,它需要经历测试需求的分析、测试环境的准备、数据的准备与验证、测试的执行预分析以及上线后的监控这样一个过程。前面的文章已经为大家介绍了人工智能系统测试生命周期的“需求分析”环节、“测试环境准备…

【TCP协议】

一、TCP分层 TCP/IP协议是Internet互联网中最基本的协议,其在一定程度上参考了OSI七层模型,但在TCP/IP协议中,七层被简化成了四层,如下: OSI模型TCP/IP协议第七层应用层 应用层 HTTP/FTP/SMTP/Telnet 第六层显示层第…

UI设计:具备什么特征,就可以被认定为时尚风格

一、时尚风格的特征 时尚风格的UI设计通常具备以下一些特征: 扁平化设计:时尚风格的UI设计通常采用扁平化的设计风格,包括简洁的图标、清晰的排版和简约的色彩搭配。极简主义:时尚风格的UI设计追求极简主义,注重简洁、…