OpenCV Python KNN数字识别

OpenCV Python KNN数字识别

KNN代表K最近邻算法,是一种基于监督学习的机器学习算法。它试图将新的数据点放入最相似的可用类别中。所有可用的数据被分类为不同的类别,根据相似性将新的数据点放入其中之一。

KNN算法工作原理如下−

  • 尽量选择一个奇数作为要检查的邻居数量K。
  • 计算它们之间的欧几里德距离。
  • 根据计算得到的欧几里德距离选择K个最近邻。
  • 计算每个类别中的数据点数量。
  • 数据点数量最多的类别是新数据点所归类的类别。

作为使用OpenCV实现KNN算法的示例,我们将使用以下图像digits.png,其中包含5000个手写数字的图像,每个图像大小为20X20像素。

OpenCV Python KNN数字识别

首先将这张图片分成5000个数字。这是我们的特征集。将其转换为NumPy数组。下面是程序的示例−

import numpy as np
import cv2

image = cv2.imread('digits.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

fset=[]
for i in np.vsplit(gray,50):
   x=np.hsplit(i,100)
   fset.append(x)

NP_array = np.array(fset)

现在我们将这些数据分为训练集和测试集,每个大小为(2500,20×20),如下所示−

trainset = NP_array[:,:50].reshape(-1,400).astype(np.float32)
testset = NP_array[:,50:100].reshape(-1,400).astype(np.float32)

接下来,我们需要为每个数字创建10个不同的标签,如下所示 –

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

我们现在有条件开始KNN分类了。创建分类器对象并训练数据。

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

选择k的值为3,获取分类器的输出。

ret, output, neighbours, distance = knn.findNearest(testset, k = 3)

将输出结果与测试标签进行比对,以检查分类器的性能和准确率。

该程序在准确检测手写数字方面显示了91.64%的准确率。

result = output==test_labels
correct = np.count_nonzero(result)
accuracy = (correct*100.0)/(output.size)
print(accuracy)

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程