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的个数

代码展示:

python 复制代码
# 灰度图
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)

运行结果:

相关推荐
m4Rk_2 小时前
【论文阅读】Agent 记忆机制(83):Inside Out——用可演化 PersonaTree 构建 Agent 的核心长期记忆
论文阅读·人工智能·学习·开源·github
不会就选b2 小时前
算法日常・每日刷题--<贪心>25
数据结构·算法
运行时异常2 小时前
【WMS 仓储系统集成 AI Agent 实战】第 8 讲(终篇):生产部署与并发安全——Semaphore 放进 Flux.defer 的坑,压测抓了一晚上
人工智能·安全
杨杨杨大侠2 小时前
Jev、Kev、Laya:决策模型怎么选,什么时候需要微调?
人工智能·python·agent
代码方舟2 小时前
零信任架构实战:基于天远人企关联构建自动化供应链金融网关
运维·人工智能·架构·自动化
虹科网络安全2 小时前
“顶会”看安全(十八):超越越狱:揭示由能力边界模糊引发的 LLM 应用安全风险
人工智能·安全
LOVE️YOU2 小时前
Python 在定义函数时,究竟定义的是什么?
python
Maiko Star2 小时前
* LangChain 提示词模板详解:ChatPromptTemplate 的使用与高级特性
java·人工智能·langchain
段一凡-华北理工大学2 小时前
大模型应用开发 100 天:Python + LLM 从入门到精通 day26~Prompt 调试与优化——A/B 测试与效果评估
windows·python·大模型·prompt·智能体·提示词工程·高炉智能化
Minecraft红客2 小时前
以撒的结合
python·游戏·电脑·娱乐