一、使用模板匹配算法

match.py:

import os
import Function

root_dir = "digits/train2"
file7_7 = open("digits/picture7_7.txt", 'w+')
for fl in os.listdir(root_dir):
    img_str = fl[0:-4] + ":" + Function.image_compression(root_dir + '/' + fl)
    file7_7.write(img_str + '\n')
file7_7.close()
file7_7 = open("digits/picture7_7.txt", 'r')
root_dir = "digits/test"
Correct_rate = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Error_rate = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Rejection_rate = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

for fl in os.listdir(root_dir):
    Same_dist_number = 0
    Same_class = -1
    min_dist = 7
    dist_img = ""
    test_img_str = Function.image_compression(root_dir + '/' + fl)
    while True:
        line = file7_7.readline()
        if not line:
            file7_7.seek(0)
            break
        train_str = line[-50:-1]
        temp_dist = Function.distance(test_img_str, train_str)
        if temp_dist < min_dist:
            min_dist = temp_dist
            dist_img = line[0:-51]
            Same_dist_number = 0
            Same_class = -1
        elif temp_dist == min_dist:
            Same_dist_number += 1
            if dist_img[0:1] == line[0:1]:
                Same_class = eval(line[0:1])
            else:
                Same_class = -1
    if Same_dist_number == 0:
        print("测试数字:", fl[0:-4], "  --  识别出来的结果:", dist_img)
        if fl[0] == dist_img[0]:
            Correct_rate[eval(fl[0])] += 1
        else:
            Error_rate[eval(fl[0])] += 1
    elif Same_class == -1:
        print("测试数字:", fl[0:-4], "  --  该数字拒绝识别!")
        Rejection_rate[eval(fl[0])] += 1
    else:
        print("测试数字:", fl[0:-4], "  --  识别出来的结果(类):", Same_class)
        if eval(fl[0]) == Same_class:
            Correct_rate[eval(fl[0])] += 1
        else:
            Error_rate[eval(fl[0])] += 1
file7_7.close()
print("------------------------------------------------")
for i in range(10):
    print("数字 {:d} 识别的正确率 = {:.2f}% ,错误率 = {:.2f}% ,拒绝识别率 = {:.2f}%".format(i, Correct_rate[i] * 5, Error_rate[i] * 5,
                                                                            Rejection_rate[i] * 5))
print("成功!")

Function.py:

import cv2

def image_compression(img_path):
    img_str = ""
    img = cv2.imread(img_path)
    x = y = 0
    for k in range(1, 50):
        title_imf = 0
        for i in range(4):
            for j in range(4):
                if img[x + i - 1][y + j - 1][0] > 127:
                    title_imf += 1
        y = (y + 4) % 28
        if title_imf >= 13:
            img_str += '1'
        else:
            img_str += '0'
        if k % 7 == 0:
            x = x + 4
            y = 0
    return img_str

def distance(test_str, train_str):
    len_str = len(train_str)
    dist = 0.0
    for i in range(len_str):
        dist += (eval(test_str[i:i + 1]) - eval(train_str[i:i + 1])) ** 2
    dist **= 0.5
    return dist

二、k邻近算法实现

k.py

import os
import numpy as np
import Function2

def handwritingClassficationTest():
    hwLabels = []
    trainingFileList = os.listdir('digits/trainingDigits')
    m = len(trainingFileList)
    trainingMat = np.zeros((m, 1024))
    for i in range(m):
        fileNameStr = trainingFileList[i]
        fileStr = fileNameStr.split('.')[0]
        classNumStr = int(fileStr.split('_')[0])
        hwLabels.append(classNumStr)
        trainingMat[i, :] = Function2.img2vector('digits/trainingDigits/%s' % fileNameStr)
    testFileList = os.listdir('digits/testDigits')
    errorCount = 0.0
    mTest = len(testFileList)
    for i in range(mTest):
        fileNameStr = testFileList[i]
        fileStr = fileNameStr.split('.')[0]
        classNumStr = int(fileStr.split('_')[0])
        vectorUnderTest = Function2.img2vector('digits/testDigits/%s' % fileNameStr)
        classifierResult = Function2.classify0(vectorUnderTest, trainingMat, hwLabels, 3)
        print("测试出的数字是: %s, 正确的数字是: %s" % (classifierResult, classNumStr))
        if (classifierResult[0] != classNumStr): errorCount += 1.0
    print("\n 识别错误的个数是: %s" % errorCount)
    print("\n 正确率为: %f" % (1 - errorCount / float(mTest)))

handwritingClassficationTest()

Function2.py:

from os import listdir
from numpy import *
import operator

def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]

diffMat = tile(inX, (dataSetSize, 1)) - dataSet

sqDiffMat = diffMat ** 2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances ** 0.5
    sortedDistIndicies = distances.argsort()
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0]

def img2vector(filename):
    returnVect = zeros((1, 1024))
    fr = open(filename)

for i in range(32):
        lineStr = fr.readline()
        for j in range(32):
            returnVect[0, 32 * i + j] = int(lineStr[j])

return returnVect

def identify(image):
    imageVector = zeros((1, 1024))
    for i in range(32):
        for j in range(32):
            imageVector[0, 32 * i + j] = int(image[i][j])

hwLabels = []
    trainingFileList = listdir('digits/trainingDigits')
    m = len(trainingFileList)

trainingMat = zeros((m, 1024))

for i in range(m):
        fileNameStr = trainingFileList[i]
        fileStr = fileNameStr.split('.')[0]
        classNumStr = int(fileStr.split('_')[0])
        hwLabels.append(classNumStr)

trainingMat[i, :] = img2vector('digits/trainingDigits/%s' % fileNameStr)

classifierResult = classify0(imageVector[0], trainingMat, hwLabels, 3)

result = {}
    result['result1'] = classifierResult[0]
    result['result2'] = classifierResult[1]
    return result
其中模板匹配使用28*28像素大小的手写数据集,k邻近算法使用二进制手写数据集。

基于opencv实现的手写数字识别相关推荐

  1. python opencv数字识别_基于模板匹配的手写数字识别(python+opencv)

    智能计算课第一周的实验是做基于模板匹配的手写数字识别,光听见就很感兴趣,于是决定认真做做这个实验,本实验基于python3+opencv的python版本,所用到的知识都比较简单,基本上边学边做,技术 ...

  2. 基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明)

    基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明) 配置环境 1.前言 2.问题描述 3.解决方案 4.实现步骤 4.1数据集选择 4.2构建网络 4.3训练网络 4.4测试网络 4.5图 ...

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

    摘 要 深度学习是传统机器学习下的一个分支,得益于近些年来计算机硬件计算能力质的飞跃,使得深度学习成为了当下热门之一.手写数字识别更是深度学习入门的经典案例,学习和理解其背后的原理对于深度学习的理解有 ...

  4. 基于深度学习的手写数字识别、python实现

    基于深度学习的手写数字识别.python实现 一.what is 深度学习 二.加深层可以减少网络的参数数量 三.深度学习的手写数字识别 一.what is 深度学习 深度学习是加深了层的深度神经网络 ...

  5. 基于K210的MNIST手写数字识别

    基于K210的MNIST手写数字识别 项目已开源链接: Github. 硬件平台 采用Maixduino开发板 在sipeed官方有售 软件平台 使用MaixPy环境进行单片机的编程 官方资源可在这里 ...

  6. 基于深度学习的手写数字识别Matlab实现

    基于深度学习的手写数字识别Matlab实现 1.网络设计 2. 训练方法 3.实验结果 4.实验结果分析 5.结论 1.网络设计 1.1 CNN(特征提取网络+分类网络) 随着深度学习的迅猛发展,其应 ...

  7. MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试

    文章目录 MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试 一.题目要求 二.完整的目录结构说明 三.Mnist数据集及数据格式转换 四.BP神经网络相关知识 4.1 ...

  8. 手把手教你使用LabVIEW OpenCV DNN实现手写数字识别(含源码)

    文章目录 前言 一.OpenCV DNN模块 1.OpenCV DNN简介 2.LabVIEW中DNN模块函数 二.TensorFlow pb文件的生成和调用 1.TensorFlow2 Keras模 ...

  9. 课程设计(毕业设计)—基于机器学习KNN算法手写数字识别系统—计算机专业课程设计(毕业设计)

    机器学习KNN算法手写数字识别系统 下载本文手写数字识别系统完整的代码和课设报告的链接(或者可以联系博主koukou(壹壹23七2五六98),获取源码和报告):https://download.csd ...

最新文章

  1. CVPR2020:基于层次折叠的跳跃式注意网络点云完成
  2. 一步步学习SPD2010--第十一章节--处理母版页(8)--从母版页创建网页
  3. vue-cli3.0 生产包去除console.log
  4. Spring MVC GET 从客户端数据到服务器端的乱码和服务器端数据到客户端的乱码
  5. Ubuntu系统下桌面卡死,但是鼠标键盘可以动
  6. Windows环境配置Anaconda+cuda+cuDNN+pytorch+jupyter notebook
  7. 动态加载laydate 失效_Java对象的内存布局+反射的原理+动态代理+ 并发和锁+文末彩蛋...
  8. 【转】Android开发之数据库SQL
  9. lin-cms-dotnetcore功能模块的设计
  10. 互联网晚报 | 3月8日 星期二 |​ ​​沪指深V反弹,创业板指跌幅收窄至0.75%;腾讯低代码平台与微信开发者平台打通...
  11. 2021高校暑假时间汇总!最长70天
  12. php与web页面交互
  13. JavaScript的RegExp实例方法exec()
  14. A Translation for Quaternion 一篇对四元数的翻译
  15. XMPP即时通讯资料记录
  16. 老化测试相关知识点介绍
  17. 使用FFmpeg将MP4转换为ts文件
  18. php6基因突变,基因突变中那些“披着狼皮的羊” 很多“致命性”基因突变正在被证实无害...
  19. 看了这个逻辑关系图,才更清晰为何不让你随便外出了
  20. Object-based superresolution land cover Mapping From Remotely sensed imagery

热门文章

  1. c#如何合并多个word文档中的内容到一个word中
  2. 智能电子棋盘产品分析
  3. SQL截取重复字符且该是最后字符之前的数据
  4. 电子科大计算机学院张小松院长,电子科大网络空间安全研究中心主任张小松:网络安全产业有望成为成都新名片...
  5. 舞台上有你,就演好角色; 舞台上没你,就静静地做观众
  6. char *字符串和char[]的区别
  7. qemu-win10
  8. 用PyTorch实现图像聚类
  9. [HCIP] 03 - 路由控制之路由策略
  10. 学生成绩管理系统程序设计(linuxC)