手写字识别

对手写字体图片进行识别最重要的一点就是要将其转化为二值化(就是就是将图像上的像素点或灰度值设置为0或1,其呈现就是非黑即白)后的数据,然后再进行处理,在手写体处理中,二值化就是有手写笔画的部分用1表示,其余部分用0表示(当然也可以根据自己所写的算法进行调整)

手写字识别可以用很多种算法来计算,首先用Knn算法来实现:

  1. Knn算法进行手写数字的识别

    # -*- coding: utf-8 -*-
    # @Time    : 2021/7/19 20:30
    # @Author  : wcc
    # @FileName: HandwritingRecognition.py
    # @Software: PyCharm
    # @Blog    :https://blog.csdn.net/qq_41575517?spm=1000.2115.3001.5343import numpy as np
    from os import listdir
    import KnnAlog as Knnclass HwRecognition:def __init__(self, dir_name):self.dirName = dir_namedef pretreatment(self):# 读取目录下的所有文件的名称fileNameList = listdir(self.dirName)# 由于要用Knn算法进行处理,所以要将32*32的矩阵转化为1*1024的矩阵,此处先创建一个1*1024大小的0阵fileDataMat = np.zeros((1, 1024))# 判断目录中文件的个数m = len(fileNameList)# 创建一个列表用来保存标签字段labelSet = []# 把所有的1*1024行集中到一个文件中,变为一个m*1024的矩阵dataSet = np.zeros((m, 1024))for i in range(int(m)):# 由于目录中一共有m个文件,所以此处需要遍历循环m次来遍历所有文件fileNameStr = fileNameList[i]# 因为所有标签都在文件名称中隐含,所以此处直接用'_'切割字段,取出每个文件的标签label = fileNameStr.split('_')[0]# 将标签字段添加进标签集中labelSet.append(int(label))# 读文件,此处是读取'trainingDigits'/ + fileNameStr 处的文件fr = open('trainingDigits/%s'% fileNameStr)# 由于每一个文件都是32*32的文件,所以需要双层循环才能访问本文件的全部内容for j in range(32):# 读取本行的数据并赋给linestrlineStr = fr.readline()for k in range(32):# 将每一行的数据依次放入fileDataMat矩阵中,注意:双层循环结束之后fileDataMat中的数据是一个文件中的数据fileDataMat[0, 32 * j + k] = int(lineStr[k])# 将本次循环访问的文件中的数据放入数据集的第i行dataSet[i, :] = fileDataMatlabelSet = np.array(labelSet)return dataSet, labelSetif __name__ == '__main__':training_dir_name = 'trainingDigits'k = 3hw1 = HwRecognition(dir_name=training_dir_name)trainingSet, trainingLabelSet = hw1.pretreatment()test_dir_name = 'testDigits'hw1 = HwRecognition(dir_name=test_dir_name)testSet, testLabelSet = hw1.pretreatment()# 错误条数errorCount = 0# 错误记录errorRecords = {}# 错误值与正确值的比对correctRecords = {}for i in range(int(testSet.shape[0])):result = Knn.KnnAlog(testSet[i], trainingSet, trainingLabelSet, k).knn()if testLabelSet[i] != result:errorCount += 1errorRecords[i] = resultcorrectRecords[i] = testLabelSet[i]print('错误个数:')print(errorCount)print('错误位置及错误值:')print(errorRecords)print('相应位置的正确值:')print(correctRecords)print("正确率:%f%%" % ((1-errorCount / int(testSet.shape[0]))*100))
    

    以上算法是根据已经提把手写字体的图片进行二值化并且生成32*32的数据文件后进行处理的,并不涉及二值化处理。

    对单个图片进行二值化处理并且进行knn算法识别的代码如下所示:

    # -*- coding: utf-8 -*-
    # @Time    : 2021/7/20 12:03
    # @Author  : wcc
    # @FileName: Binarization.py
    # @Software: PyCharm
    # @Blog    :https://blog.csdn.net/qq_41575517?spm=1000.2115.3001.5343import cv2
    import HandwritingRecognition as hw
    import KnnAlog as Knnimage = cv2.imread("C:/Users/Administrator/Desktop/vocation/image/1_1.png")
    image2 = cv2.resize(image, (32, 32))
    gray = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
    ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY)for i in range(32):for j in range(32):binary[i, j] = 255 - binary[i, j]
    binary = ~binary# cv2.imshow("binary", binary)
    # cv2.waitKey(0)
    cv2.imwrite("C:/Users/Administrator/Desktop/vocation/image/1_1.jpg", binary)test = []
    # 把二值化后的数据转化为测试数据
    for i in range(32):for j in range(32):if binary[i, j] == 255:test.append(0)else:test.append(1)training_dir_name = 'trainingDigits'
    k = 3
    trainingSet, trainingLabelSet = hw.HwRecognition(dir_name=training_dir_name).pretreatment()
    result = Knn.KnnAlog(test, trainingSet, trainingLabelSet, k).knn()print(result)
    

    上述代码中调用的Knn算法如下所示

import numpy as np
# 个模块是从Classify.py中抽离封装出来的class KnnAlog:# inX:未知类型数据; trainSet:训练集;labels:训练集标签项(每个数据所属类型);k:样本所属范围def __init__(self, inX, trainSet, labels, k):self.inX = inXself.trainSet = trainSetself.labels = labelsself.k = kdef knn(self):# 此处sum()中的参数可以为0或者是1,若为0,则按列求和,若为1,则按行求和dist = (((self.inX - self.trainSet) ** 2).sum(1)) ** 0.5# argsort()函数是将x中的元素从小到大排列,提取其对应的index(索引),然后输出到ysortedDist = dist.argsort()# 定义一个字典,其作用是为了判断前k-1个样本中每个种类出现了几次classCount = {}for i in range(self.k):voteLable = self.labels[sortedDist[i]]# get()方法中第二个属性的意思是若关键字不存在于字典中,则返回0classCount[voteLable] = classCount.get(voteLable, 0) + 1# 在字典中寻找哪一类出现的次数最多maxType = 0maxCount = -1# 这种遍历方式是在字典中遍历的方式,直接用key和value取字典中的键值对即可for key, value in classCount.items():if value > maxCount:maxType = keymaxCount = valuereturn maxType

机器学习之手写字识别(Knn算法应用)相关推荐

  1. 手写字识别knn模型

    1.实验原理: Knn算法:邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是机器学习分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都 ...

  2. 基于tensorflow的MNIST手写字识别

    一.卷积神经网络模型知识要点卷积卷积 1.卷积 2.池化 3.全连接 4.梯度下降法 5.softmax 本次就是用最简单的方法给大家讲解这些概念,因为具体的各种论文网上都有,连推导都有,所以本文主要 ...

  3. TensorFlow基于minist数据集实现手写字识别实战的三个模型

    手写字识别 model1:输入层→全连接→输出层softmax model2:输入层→全连接→隐含层→全连接→输出层softmax model3:输入层→卷积层1→卷积层2→全连接→dropout层→ ...

  4. 利用卷积神经网络实现手写字识别

    本文我们介绍一下卷积神经网络,然后基于pytorch实现一个卷积神经网络,并实现手写字识别 卷积神经网络介绍 传统神经网络处理图片问题的不足 让我们先复习一下神经网络的工作流程: 搭建一个神经网络 将 ...

  5. 【机器学习】手写识别系统

    [机器学习]手写识别系统 过程 ==准备数据:将图像转换为测试向量== ==测试算法:使用k-近邻算法识别手写数字== ==完整代码== 过程 收集数据:提供文本文件 准备数据:编写函数classif ...

  6. .net 数字转汉字_TensorFlow 2.0 中文手写字识别(汉字OCR)

    TensorFlow 2.0 中文手写字识别(汉字OCR) 在开始之前,必须要说明的是,本教程完全基于TensorFlow2.0 接口编写,请误与其他古老的教程混为一谈,本教程除了手把手教大家完成这个 ...

  7. Pytorch入门练习-kaggle手写字识别神经网络(SNN)实现

    采用pytorch搭建神经网络,解决kaggle平台手写字识别问题. 数据来源:https://www.kaggle.com/competitions/digit-recognizer/data 参考 ...

  8. python手写汉字识别_TensorFlow 2.0实践之中文手写字识别

    问题导读: 1.相比于简单minist识别,汉字识别具有哪些难点? 2.如何快速的构建一个OCR网络模型? 3.读取的时候有哪些点需要注意? 4.如何让模型更简单的收敛? 还在玩minist?fash ...

  9. 在Windows上调试TensorFlow 2.0 中文手写字识别(汉字OCR)

    在Windows上调试TensorFlow 2.0 中文手写字识别(汉字OCR) 一.环境的搭建 Windows+1080Ti+Cuda10.1 Tsorflow2.0.0 Numpy1.16.4 注 ...

最新文章

  1. html页面引入另一个html页面
  2. JS中8个常见的陷阱
  3. 浅谈文献总结(2018.9.28)——坚恒勇毅论文课笔记
  4. C++ const成员和引用成员
  5. 热搜!华为:这类程序员领10亿,程序员:真香!你怎么看?
  6. 如何手动删除不需要的windows服务
  7. windows 笔记本连接公共wifi不弹出登录页面的处理办法
  8. Java中this关键字详解
  9. windows_clion_Process finished with exit code -1073741515 (0xC0000135)
  10. STM32—驱动RFID-RC522模块
  11. 网工解惑?什么是路由器、交换机与防火墙,他们的区别与联系是什么?
  12. 单自由度体系对简谐荷载的反应
  13. Winform 俄罗斯方块儿练习
  14. 吉信通php 短信配置,吉信通:手机APP为什么要用短信验证?
  15. mysql forward_only_mysql参数调优
  16. java的碳刀_骑行圈的十万个为什么—碳刀简述1
  17. 张艾迪(创始人): 梦想与理想
  18. C语言写的小游戏源码,c语言小游戏源码(华容道)
  19. hdu 6053 TrickGCD
  20. VS 2017经常出现打不开问题

热门文章

  1. pcm 降采样_图像降采样和升采样
  2. |●梯度下降是什么|●梯度下降算法原理|●梯度下降实例
  3. Wifi断网自动重连
  4. Mysql:优化分析(值得深思)
  5. ps 需要截取某个图层的某个部分,但是被该图层的其他东西遮挡
  6. 网页版本的飞行日志分析平台是_如何进行网站日志分析
  7. 画论02 顾恺之《魏晋胜流画赞》
  8. 快和她在圣诞节看一场烟花吧
  9. Ubuntu16.04显卡崩溃重装教程
  10. 神经网络模型每次训练结果不一致