文章目录

  • 一、基本原理
    • 1、载入训练图片:
    • 2、图片分割:
    • 3、灰度处理:
    • 4、数据矩阵化:
    • 5、分配训练集与测试集:
    • 6、将训练测试集进行标定:
    • 7、创建KNN邻近:
    • 8、使用测试集:
  • 二、具体代码
    • 1、训练与测试准确率代码
    • 2、通过训练模型对某张500*500像素图片进行识别
  • 附录
    • 1、训练图片
    • 2、测试图片

一、基本原理

1、载入训练图片:

读取OpenCV安装目录下手写图片合集(图片地址:opencv\sources\samples\data\digits.png)
若找不到可以查看本文附录中的图片进行下载使用

2、图片分割:

此图片大小为2000*1000 有5K个手写字符可以求得每个数字大约占有400个像素故将图像分割为 20 *20 的小块

3、灰度处理:

将分割的图片进行灰度化,使原本的RGB多维数据转化为二维灰度数据,方便处理

4、数据矩阵化:

将灰度图像转换为矩阵横向划分为100份,纵向划分50份

5、分配训练集与测试集:

分别分配50列,前50列为训练集,后50列为测试集

6、将训练测试集进行标定:

方便确定每个块内的数字具体是多少

7、创建KNN邻近:

训练模型

8、使用测试集:

检测模型准确率


二、具体代码

1、训练与测试准确率代码

img = cv.imread('D:\OpenCV\opencv\sources\samples\data\digits.png')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 将图片进行分割成5000块横向100纵向50,分割为20*20
# 纵线分割np.hsplit(数组,份数),横线分割np.vsplit(数组,份数)
cells = [np.hsplit(row,100) for row in np.vsplit(gray,50)]
# 使其成为一个Numpy数组,大小为(50,100,20,20)
x = np.array(cells)
# 准备train_data和test_data
train = x[:,:50].reshape(-1,400).astype(np.float32)
test = x[:,50:100].reshape(-1,400).astype(np.float32)# 创建测试,训练标签
k = np.arange(10)
train_labels = np.repeat(k,250)[:,np.newaxis]
test_labels = train_labels.copy()
# 初始化KNN,训练数据,然后使用k = 1的测试数据对其进行测试
knn = cv.ml.KNearest_create()
knn.train(train,cv.ml.ROW_SAMPLE,train_labels)
ret,result,neighbours,dist = knn.findNearest(test,k=5)#test
# 检测分类的准确性
# 将结果与test_labels进行比较,检查哪个是错误的
print(result)
matches = result == test_labels
correct = np.count_nonzero(matches)
accuracy = correct*100.0/result.size
print(accuracy)

2、通过训练模型对某张500*500像素图片进行识别

import numpy as np
import cv2 as cv# ------------------输入图片处理部分--------------------------------
test_img = cv.imread('./img/3.jpg')
# 缩放测试图片至20*20
height, width = test_img.shape[:2]
size = (int(width/25), int(height/25))
res = cv.resize(test_img,size, interpolation=cv.INTER_CUBIC)
# 图片进行灰度处理
res_gray = cv.cvtColor(res,cv.COLOR_BGR2GRAY)
# 生成等长的纯白255矩阵
test_array = np.array(res_gray)
g25 = np.ones(test_array.shape)
g25 = g25*255
# 相减将底色与字体实际灰度值调换(将底色变为黑色,字体变为白色)
test_array = g25-test_array
# 将多维矩阵转换为一维矩阵
input_test = test_array[:,:].reshape(-1,400).astype(np.float32)
print(input_test.size)
'''
# 显示输入图片(调试使用)
cv.imshow('result_img',res)
cv.waitKey(0)
'''
# ------------------输入图片处理完成--------------------------------img = cv.imread('D:\OpenCV\opencv\sources\samples\data\digits.png')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 将图片进行分割成5000块横向100纵向50,分割为20*20
# 纵线分割np.hsplit(数组,份数),横线分割np.vsplit(数组,份数)
cells = [np.hsplit(row,100) for row in np.vsplit(gray,50)]
# 使其成为一个Numpy数组,大小为(50,100,20,20)
x = np.array(cells)
# 准备train_data和test_data
train = x[:,:50].reshape(-1,400).astype(np.float32)
test = x[:,50:100].reshape(-1,400).astype(np.float32)# 创建测试,训练标签
k = np.arange(10)
train_labels = np.repeat(k,250)[:,np.newaxis]
test_labels = train_labels.copy()
# 初始化KNN,训练数据,然后使用k = 1的测试数据对其进行测试
knn = cv.ml.KNearest_create()
knn.train(train,cv.ml.ROW_SAMPLE,train_labels)
ret,result,neighbours,dist = knn.findNearest(input_test,k=5)#test
# 结果输出
print(result)

附录

1、训练图片

2、测试图片

Python+OpenCV实现图像处理OCR手写数字识别原理相关推荐

  1. OCR手写数字识别什么软件好用?介绍一种

    OCR是指用电子设备检查文本上的资料,然后对图像文件进行分析处理,从而获取文字及版面信息的过程.那OCR手写数字识别有好用的软件吗?当我们需要整理大量手写资料需要整理时,下面这两款软件就派上用场了. ...

  2. 基于Python的BP网络实现手写数字识别

    资源下载地址:https://download.csdn.net/download/sheziqiong/86790047 资源下载地址:https://download.csdn.net/downl ...

  3. Python基于深度学习的手写数字识别

    Python基于深度学习的手写数字识别 1.代码的功能和运行方法 2. 网络设计 3.训练方法 4.实验结果分析 5.结论 1.代码的功能和运行方法 代码可以实现任意数字0-9的识别,只需要将图片载入 ...

  4. Python实现基于机器学习的手写数字识别系统

    目 录 摘要 I ABSTRACT II 1 绪论 1 1.1 数字识别研究现状 1 1.2 深度学习的发展与现状 1 1.3 研究意义 2 1.4 论文结构 3 2 卷积神经网络基本原理 4 2.1 ...

  5. Python实现深度学习MNIST手写数字识别(单文件,非框架,无需GPU,适合初学者)

    注: 本文根据阿卡蒂奥的Python深度学习博客文章代码进行调整,修复了少量问题,原文地址:https://blog.csdn.net/akadiao/article/details/78175737 ...

  6. 用python的numpy实现mnist手写数字识别

    完整代码的文章底部(Optimization_mnist.py和lr_utils.py),原理和公式部分可以看前面文章,转载文章请附上本文链接 学完前面(1到6)文章就完成了吴恩达deeplearni ...

  7. 用python创建的神经网络--mnist手写数字识别率达到98%

    周末根据Tariq Rashid大神的指导,没有使用tensorflow等框架,用python编写了一个三层神经网络,并应用再mnist手写库识别上,经过多方面参数调优,识别率竟然达到了98%.  调 ...

  8. (一)Lenet5 手写数字识别原理及代码解析

    模型简单,本地可跑 论文参考:Gradient-based learning applied to document recognition MNIST手写数据集 50000个训练数据 10000个测 ...

  9. linux手写数字识别opencv,opencv实现KNN手写数字的识别

    人工智能是当下很热门的话题,手写识别是一个典型的应用.为了进一步了解这个领域,我阅读了大量的论文,并借助opencv完成了对28x28的数字图片(预处理后的二值图像)的识别任务. 预处理一张图片: 首 ...

最新文章

  1. linux grep命令总结
  2. 使用ckeditor
  3. CFString​Transform
  4. python学习笔记-5.18
  5. Winform中怎样在工具类中对窗体中多个控件进行操作(赋值)
  6. 【图像处理】——Python霍夫变换之直线检测(主要是两个函数HoughlinesHoughlinesP)
  7. leetcode combinations java_[LeetCode][Java] Combinations
  8. 【Python】time内置模块处理时间信息
  9. 乐视轰然倒塌;智能驾驶上路;360回归A股 | 2017年度科技大事件盘点
  10. JavaScript函数—JavaScript闭包
  11. mysql 远程虚拟主机_navicat 远程连接虚拟机MYSQL数据库
  12. FontExplorer X Pro for Mac字体管理软件
  13. 智能送药小车(F 题)--2021 年全国大学生电子设计竞赛
  14. P1048 采药 洛谷Oj
  15. 教你如何设计ASP网上考试系统
  16. iOS程序的Build过程
  17. 自动回复邮件 html,创意十足的邮件自动回复
  18. Android实现可录音/暂停录音/播放录音的录音软件
  19. 做大数据可视化分析的软件和工具有哪些?
  20. 编译原理实验(三)词法语法分析综合设计

热门文章

  1. Android 12上焕然一新的小组件
  2. 不必上抖音,AI Studio社区项目帮你完成简约风格迁移
  3. 判断用户输入的年份(平年或闰年)
  4. 备考H12-221 HCIP-Routing Switching-IERS的一些笔记
  5. git推送代码详细教程
  6. Python实现“维基百科六度分隔理论“之基础爬虫
  7. mysql数据库中学分的简写_一些数据库相关词汇缩写
  8. 【UEFI实战】HII之配置
  9. 自学go语言的笔记干货
  10. 互联网+废品回收项目可行性分析报告