win10+Python3.7.3+OpenCV3.4.1入门学习(二十章 K近邻算法)————20.5 K近邻模块的基本使用

Python版本是Python3.7.3,OpenCV版本OpenCV3.4.1,开发环境为PyCharm

20.5 K近邻模块的基本使用

在OpenCV中,不需要自己编写复杂的函数实现K近邻算法,直接调用其自带的模块函数即可。本节通过一个简单的例子介绍如何使用OpenCV自带的K近邻模块。
eg2:演示OpenCV自带的K近邻模块的使用方法。
本例中有两组位于不同位置的用于训练的数据集,如图20-14所示。两组数据集中,一组位于左下角;另一组位于右上角。随机生成一个数值,用OpenCV中的K近邻模块判断该随机数属于哪一个分组。
在这里插入图片描述

上述两组数据中,位于左下角的一组数据,其x、y坐标值都在(0, 30)范围内。位于右上角的数据,其x、y坐标值都在(70, 100)范围内。
根据上述分析,创建两组数据,每组包含20对随机数(20个随机数据点):

rand1 = np.random.randint(0, 30, (20, 2)).astype(np.float32)
rand2 = np.random.randint(70, 100, (20, 2)).astype(np.float32)

● 第1组随机数rand1中,其x、y坐标值均位于(0, 30)区间内。
● 第2组随机数rand2中,其x、y坐标值均位于(70, 100)区间内。
接下来,为两组随机数分配标签:
● 将第1组随机数对划分为类型0,标签为0。
● 将第2组随机数对划分为类型1,标签为1。
然后,生成一对值在(0, 100)内的随机数对:

test = np.random.randint(0, 100, (1, 2)).astype(np.float32)

最后,使用OpenCV自带的K近邻模块判断生成的随机数对test是属于rand1所在的类型0,还是属于rand2所在的类型1。
根据分析,编写代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
#用于训练的数据
#rand1数据位于(0,30)
rand1 = np.random.randint(0, 30, (20, 2)).astype(np.float32)
#rand2数据位于(70,100)
rand2 = np.random.randint(70, 100, (20, 2)).astype(np.float32)
#将rand1和rand2拼接为训练数据
trainData = np.vstack((rand1, rand2))
#数据标签,两类:0,1
#r1Label对应着rand1的标签,为类型0
r1Label=np.zeros((20,1)).astype(np.float32)
#r2Label对应着rand2的标签,为类型1
r2Label=np.ones((20,1)).astype(np.float32)
tdLable = np.vstack((r1Label, r2Label))
#使用绿色标注类型0
g = trainData[tdLable.ravel() == 0]
plt.scatter(g[:,0], g[:,1], 80, 'g', 'o')
#使用蓝色标注类型1
b = trainData[tdLable.ravel() == 1]
plt.scatter(b[:,0], b[:,1], 80, 'b', 's')

plt.show()
#test用于测试的随机数,该数在0到100之间
test = np.random.randint(0, 100, (1, 2)).astype(np.float32)
plt.scatter(test[:,0], test[:,1], 80, 'r', '*')
#调用OpenCV内的KNN,并训练
knn = cv2.ml.KNearest_create()
knn.train(trainData, cv2.ml.ROW_SAMPLE, tdLable)
#使用KNN分类
ret, results, neighbours, dist = knn.findNearest(test, 5)
#显示处理结果
print("当前随机数可以判定为类型:", results)
print("距离当前点最近的5个邻居是:", neighbours)
print("5个最近邻居的距离: ", dist)
#可以观察一下显示,对比上述输出
plt.show()

同时,程序还会显示如下图所示的运行结果。从图中可以看出,随机点(星号点)距离右侧小方块(类型为1)的点更近,因此被判定为属于小方块的类型1。

在这里插入图片描述在这里插入图片描述

当前随机数可以判定为类型: [[1.]]
距离当前点最近的5个邻居是: [[1. 1. 1. 1. 1.]]
5个最近邻居的距离:  [[3250. 3293. 3313. 3554. 3562.]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值