当前位置: 首页 > article >正文

opencv实现KNN算法识别图片数字

KNN算法实现识别图片数字

目录

  • KNN算法实现识别图片数字
    • 图片基本情况
      • 图片
      • 数据
    • 图片数字识别
      • 图片数据处理及预测
      • 其它数字图片正确率预测

图片基本情况


图片

在这里插入图片描述

数据

图片像素是2000x1000,即高(行)1000,宽(列)2000,每个数字区域为20*20,每5行都是同一个数字,每行数字有50个,每列数字有100个
在这里插入图片描述

图片数字识别


图片数据处理及预测

  • hsplit(矩阵,n)
    竖向切分切n个
  • vsplit(矩阵,n)
    横向切分切n个
  • reshape(-1,n)
    重构二维矩阵,-1表示所有,n表示列

400列即20*20每一个数字区域,每列为一个特征数据,占一个维度

  • astype(n)
    设置数据类型
  • cv2.ml.KNearest_create()
    创建knn算法
  • train(x,cv2.ml.ROW_SAMPLE,y)
    训练模型,x为特征数据,y为结果类别,cv2.ml.ROW_SAMPLE设置按行处理数据
  • ret,result,neighbors,dist = knn.findNearest(x,k=3)
    x为特征数据,k为范围,ret bool值,result数据预测结果,neighbors邻居,dist距离
  • 矩阵==矩阵
    返回矩阵,值为bool值,如果矩阵一一对应的值相等为T,否则F
  • np.count_nonzero(矩阵),计算为矩阵内非0的个数

代码展示:

# 灰度图
img1 = cv2.imread('tu_data.png')
img = cv2.imread('tu_data.png',0)

# 每个数字区域为20*20,每5行都是同一个数字
# hsplit 竖向切分,vsplit 沿行横向切分
# 列表生成式,先横向切分切50行,再将横向行数据竖向切分,每行切100列,共50*100=5000个图片数据,每个都是一个1000/50=20,2000/100=20
#每个图片都是20*20的数值
cells = [np.hsplit(row,100) for row in np.vsplit(img,50)]
# print(cells)
# 列表转矩阵
data_img = np.array(cells)
# print(data_img)
# 切分数据一半,一半作为历史数据培训模型,一半作为测试数据,检测
# 切分后的是一半是5000/2=2500个,从中间竖切一半变为50*50
train_x = data_img[:,:50]
test_x = data_img[:,50:100]
# 设置x特征数据
tr_x = train_x.reshape(-1,400).astype(np.float32)
te_x = test_x.reshape(-1,400).astype(np.float32)
# 根据图片结果构建0-9的y类别标签
# 生成0-9的np矩阵
k = np.arange(10)
# 复制标签
# 从0到9,依次复制250个,50*5=250
lab = np.repeat(k,250)
# 增加数组维度
t_lab = lab[:,np.newaxis]
#创建knn算法
knn = cv2.ml.KNearest_create()
#训练模型
knn.train(tr_x,cv2.ml.ROW_SAMPLE,t_lab)
ret,result,neighbors,dist = knn.findNearest(te_x,k=3)
# 正确率
match = result==t_lab
T = np.count_nonzero(match)
c = T*100.0/ result.size
print(c)

运行结果:
在这里插入图片描述

其它数字图片正确率预测

其他图片为单个20*20的图片,如下
代码展示:
在这里插入图片描述

import cv2
import numpy as np

# 只能是灰度图
img1 = cv2.imread('tu_data.png')
img = cv2.imread('tu_data.png',0)
# print(type(img1),type(img))
# 每个数字区域为20*20,每5行都是同一个数字
# hsplit 竖向切分,vsplit 沿行横向切分
# 列表生成式,先横向切分切50行,再将横向行数据竖向切分,每行切100列,共50*100=5000个图片数据,每个都是一个1000/50=20,2000/100=20
#每个图片都是20*20的数值
cells = [np.hsplit(row,100) for row in np.vsplit(img,50)]
# print(cells)
# 图片数据转np矩阵
data_img = np.array(cells)
# print(data_img)
# 切分数据一半,一半作为历史数据培训模型,一半作为测试数据,检测
# 切分后的是一半是5000/2=2500个,从中间竖切一半变为50*50
train_x = data_img[:,:50]
test_x = data_img[:,50:100]

# 设置x特征数据
tr_x = train_x.reshape(-1,400).astype(np.float32)
te_x = test_x.reshape(-1,400).astype(np.float32)
# 根据图片结果构建0-9的y类别标签
# 生成0-9的np矩阵
k = np.arange(10)
# 复制标签
# 从0到9,依次复制250个,50*5=250
lab = np.repeat(k,250)
# 增加数组维度
t_lab = lab[:,np.newaxis]
print(k,type(k))
print(lab,type(lab))
print(t_lab,type(t_lab))
# 创建knn算法
knn = cv2.ml.KNearest_create()
#训练模型
knn.train(tr_x,cv2.ml.ROW_SAMPLE,t_lab)
ret,result,neighbors,dist = knn.findNearest(te_x,k=3)


t1 = cv2.imread('t1.png',0)
t2 = cv2.imread('t2.png',0)
t3 = cv2.imread('t3.png',0)
t4 = cv2.imread('t4.png',0)
t5 = cv2.imread('t5.png',0)
t6 = cv2.imread('t6.png',0)
t7 = cv2.imread('t7.png',0)
t8 = cv2.imread('t8.png',0)
t9 = cv2.imread('t9.png',0)
t0 = cv2.imread('t0.png',0)
#运行都是np.array数组类型,需要添加定义为数组,再重构,可以先输出部分结果观察
tt = np.array([t0,t1,t2,t3,t4,t5,t6,t7,t8,t9])
k = np.array([0,1,2,3,4,5,6,7,8,9])
t_lab1 = k[:,np.newaxis]
tt = tt.reshape(-1,400).astype(np.float32)
# 不同数据输入可能输出结果与类型不同,判断标签可能需要调整
ret1,result1,neighbors1,dist1 = knn.findNearest(tt,k=3)
print(result1)
print(t_lab1)
match1 = result1==t_lab1
print(result1==t_lab1)
T1 = np.count_nonzero(match1)
c1 = T1*100.0/ result1.size
print(c1)

运行结果:

在这里插入图片描述


http://www.kler.cn/a/460309.html

相关文章:

  • OkHttp接口自动化测试
  • 深度学习模型预测值集中在某一个值
  • 低代码开发:开启企业数智化转型“快捷键”
  • JavaWeb开发(五)Servlet-ServletContext
  • 设计模式の状态策略责任链模式
  • 从企业级 RAG 到 AI Assistant,阿里云 Elasticsearch AI 搜索技术实践
  • 网络基础入门到深入(3):网络协议-HTTP/S
  • 时间序列预测算法---LSTM
  • 网络爬虫性能提升:requests.Session的会话持久化策略
  • HTML——38.Span标签和字符实体
  • 优秀的 Verilog/FPGA开源项目介绍(十七)- AXI
  • 【翻译】优化加速像素着色器执行的方法
  • 打印进度条
  • CentOS系统的安装配置
  • 互联网路由架构
  • Spring源码分析之SpringBoot的自动配置和ComponentScan
  • 【嵌入式硬件】直流电机驱动相关
  • gitlab-runner的卸载与安装
  • 蓝桥杯(Java)(ing)
  • 数据资产试点开启,CES Asia 2025聚焦智慧城市新发展
  • 网络爬虫的详细步骤及实现方法
  • FreeRTOS: 优先级翻转的典型场景
  • 基于 Node.js 的 ORM(对象关系映射)工具——Sequelize介绍与使用,并举案例分析
  • 【游戏设计原理】40 - 游戏体裁
  • 46. Three.js案例-创建颜色不断变化的立方体模型
  • ESP-NETIF L2 TAP 接口-物联网嵌入式开发应用