KNN实现手写数字识别(Python-OpenCV)

手写数字识别

Python-OpenCV   KNN实现手写数字识别

目标:编写一个使用OPenCV的KNN模块实现手写数字识别的程序。

训练数据和测试数据为OpenCV自带的一副包含5000个手写数字的图像digits.

该图像中每个数字有5行,100列(每个手写数字的大小为20x20像素)。

处理过程如下:

  1. 导入相关模块。
  2. 读取磁盘文件,图像色彩空间转换。
  3. 拆分数字,将图像中的每一个数字都拆分为一个独立的20像素x20像素的图像。 
  4. 拆分数据集,将所有数据划分为训练集和测试集。
  5. 图像重塑,将20x20的图像转换为1x400的列向量,以便于后续处理。
  6. 为图像“贴上”标签
  7. 创建knn分类器,完成训练,和识别
  8. 计算准确率

代码如下:

'''
knn数字识别
'''
import cv2.cv2 as cv
import numpy as np

# ===读取文件色彩空间转换
img = cv.imread('./digits.png')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 色彩空间转换
# ===拆分数字
cells = [np.hsplit(row, 100) for row in np.vsplit(gray, 50)] # 将原始图拆分为单个数字
x = np.array(cells) # 转换为ndarray
print(f'x.shape=\n{x.shape}')
# ===拆分数据集
train = x[:, :50]
test = x[:, 50:]

# ===图片拉伸为1X400的向量
train = train.reshape(-1, 400).astype(np.float32)
test = test.reshape(-1, 400).astype(np.float32)
print(f'train.shape=\n{train.shape}')
# ===贴标签
k = np.arange(10)
train_labels = np.repeat(k, 250)[:, np.newaxis] # 训练集标签
test_labels = np.repeat(k, 250)[:, np.newaxis] # 测试集标签
# ===knn
knn = cv.ml.KNearest_create() # 创建knn分类器对象
knn.train(train, cv.ml.ROW_SAMPLE, train_labels) # 开始训练
ret, result, neighbours, dist = knn.findNearest(test, k=5) # 开始预测
# ===验证
match = result == test_labels
correct = np.count_nonzero(match)
accuracy = correct*100/result.size
print(f'当前使用knn识别手写数字的准确率为:{accuracy}')

运行结果:

x.shape=
(50, 100, 20, 20)
train.shape=
(2500, 400)
当前使用knn识别手写数字的准确率为:91.76

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

』探索『

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值