openCV中的KNN算法

OpenCV 是一个开源的跨平台计算机视觉库,它提供了各种用于图像处理、计算机视觉任务的算法和工具,涵盖图像滤波、特征提取、目标检测、图像分割、视频分析等众多领域,广泛应用于计算机视觉相关的科研和工业项目中,可帮助开发者快速实现各种视觉处理功能。

KNN(K-最近邻)算法是一种简单且常用的分类算法。其核心思想是:如果一个样本在特征空间中的K个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别

KNN算法流程

  1. 计算距离:使用向量之间的距离来衡量样本之间的相似度。常见的距离计算公式有欧式距离、曼哈顿距离等。

  2. 升序排序:根据计算好的距离进行升序排序。

  3. 取前K样本:选取距离最近的前K个样本。

  4. 加权平均:根据距离对样本进行加权计算,距离越近,权重越高。

使用OpenCV实现KNN

以下是一张2000X1000像素的图片,包含5000个数字,我们将左边2500个数划分训练集,右边2500个数划分为测试集,构建模型训练结果

首先对图像进行切割并划分训练集和测试集

import numpy as np
import cv2

img=cv2.imread('digits.png')#读取名为 digits.png 的图像文件。
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#将图像转换为灰度图

cells=[np.hsplit(row,100) for row in np.vsplit(gray,50)]#将图像垂直分割50行,水平分割100列
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)

​

创建标签并对模型进行训练

k=np.arange(10)#生成一个数组 [0, 1, 2, ..., 9]
labels=np.repeat(k,250)#将每个数字重复250次,生成标签数组,形状为 (2500,)
train_labels=labels[:,np.newaxis]#将标签数组转换为列向量,形状为 (2500, 1)
test_labels=np.repeat(k,250)[:,np.newaxis]

knn=cv2.ml.KNearest_create()#创建KNN模型
knn.train(train_new,cv2.ml.ROW_SAMPLE,train_labels)#使用训练数据和标签训练模型

测试模型,计算准确率

ret,result,neighbours,dist=knn.findNearest(test_new,k=3)#对测试数据进行预测,k=3 表示使用3个最近邻居。ret:是否成功执行。result:预测结果。neighbours:最近的邻居。dist:与邻居的距离。
print(ret,result,neighbours,dist)

#计算准确率
matches=result==test_labels
correct=np.count_nonzero(matches)
accuracy=correct*100.0/result.size
print("当前使用KNN识别手写数字的准确率为{}%。".format(accuracy))

 最终代码输出得到以下结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值