python识别图片手写文字_Python徒手实现识别手写数字—简易图片数据库
Python徒手实现识别手写数字—简易图片数据库
写在前面
上一篇文章Python徒手实现识别手写数字—图像的处理中我们讲了图片的处理,将图片经过剪裁,拉伸等操作以后将每一个图片变成了1x10000大小的向量。但是如果只是这样的话,我们每一次运行的时候都需要将他们计算一遍,当图片特别多的时候会消耗大量的时间。
所以我们需要将这些向量存入一个文件当中,每次先看看图库中有没有新增的图片,如果有新增的图片,那么就将新增的图片变成1x10000向量再存入文件之中,然后从文件中读取全部图片向量即可。当图库中没有新增图片的时候,那么就直接调用文件中的图片向量进行计算就好。这样子算是节省了大量的时间。
所以本文就是从零开始建立一个这样的图片存储管理系统。
实现逻辑
第一次读入图片
我们的图库中拥有一大堆图片,每一张图片上面都是一个手写的数字,图片的名称为[数字内容]_[序号]。比如说一个图片的名称为2_3,代表这一张图片里面的数字是2,并且是“数字是2的第3张图片”。
存在一个csv文件作为我们的建议的图片数据库,名称为Data.csv。
首先我们读取图库中所有图片的名称,保存在fileNames中。然后读取Data.csv中所有数据。
提取出Data.csv的最后一列(一共10002列,第10001列说明该数字是什么数字,第10002列是图片的名称),也就是数据库中存储的所有图片的名称,存储在item中。
将新加入图库的图片名称保存在newFileNames中。如果Data.csv为空,那么就直接令newFileNames = fileNames。也就是说如果数据库中什么也没有,那么图库中所有图片都是新加入的。
如果Data.csv不为空,那么就将item里面的内容与fileNames的内容比较,如果出现了fileNames里面有的名称item中没有,那么就将这些名称放进newFileNames中。如果item里有的名称fileNames中没有,那就不管。
也就是说,我令我们的数据库只进不出。
现在我们得到了新加入图库的图片的名称newFileNames。
将newFileNames中的名称的图片带入上一文中函数GetTrainPicture进行处理,得到了一个nx10001的矩阵,每一行代表一个新加入的图片,前10000列是图片向量,第10001列是该图片的数字,保存在pic中。
将这些图片压入到数据库的后面。
读取之前数据库原有的图片向量,并与pic合并,得到目前拥有的所有的训练图片向量pic。
image.png
以上就是本章写的所有内容,下面放出代码来详细解释一下。
代码解析
主文件
import os
import numpy as np
import OperatePicture as OP
import OperateDataBase as OD
import csv
##Essential vavriable 基础变量
#Standard size 标准大小
N = 100
#Gray threshold 灰度阈值
color = 100/255
#读取原CSV文件
reader = list(csv.reader(open('DataBase.csv', encoding = 'utf-8')))
#清除读取后的第一个空行
del reader[0]
#读取num目录下的所有文件名
fileNames = os.listdir(r"./num/")
#对比fileNames与reader,得到新增的图片newFileNames
newFileNames = OD.NewFiles(fileNames, reader)
print('New pictures are: 'newFileNames)
#得到newFilesNames对应的矩阵
pic = OP.GetTrainPicture(newFileNames)
#将新增图片矩阵存入CSV中
OD.SaveToCSV(pic, newFileNames)
#将原数据库矩阵与新数据库矩阵合并
pic = OD.Combination(reader, pic)
我将两节内容分别封装在两个py文件里面,上一篇文章中的图片的切割与处理等所有内容我放在文件OperatePicture里面了,这一节的数据库处理放在了文件OperateDatabase里面。
因为整个代码的逻辑我在上面已经捋过一遍了,所以我不再解释其中的内容,接下来针对每个函数开始讲解。
OperateDatabase代码
从上面的主文件中,我们首先用到了函数NewFiles,主要是对比fileNames和reader这两个文件中图片的名称有什么不同,返回值是新增的图片的名称的列表。下面是代码
def NewFiles(fileNames, reader):
'''判断是否有不同于数据库中的新文件加入'''
#如果数据库中没有数据,则返回filenames
if len(reader) == 0:
return fileNames
else:
#从数据库中提取所有名称
files = [item[10001] for item in reader]
#需要加入的图片名称
newFileNames = []
for item in fileNames:
#判断当前名称是否存在数据库中
#如果不存在,则加入newFileNames
if item not in files:
newFileNames.append(item)
return newFileNames
首先判断reader是否有内容,如果没有内容,说明是第一次执行,那么会直接把fileNames返回。否则才会进入下面进行比较。
返回了newFileNames之后,就会把这个列表中的所有名称的图片通过GetTrainPicture函数得到一个1x10001大小的矩阵,具体过程请看我上一篇文章讲的内容。
之后为了把新的数据存入CSV文件中,我们利用函数SaveToCSV将pic存入文件中,具体代码如下。
def SaveToCSV(pic, fileNames):
'''将pic与对应的dileNames存入CSV文件'''
writer = csv.writer(open('Database.csv', 'a', newline = ''), dialect = 'excel')
#将fileNames变为列表
f = [item for item in fileNames]
#每一行依次写入文件中
for i in range(len(pic)):
#将改行图片向量转为list
item = pic[i].tolist()
#将这个图片向量对应的名称f放入列表最后一个
item.append(f[i])
writer.writerow(item)
当函数运行过后,会把pic矩阵对应的内容直接给续写入CSV文件中,相当于数据库操纵的写入,并不会覆盖之前原有的数据。
之后我们需要将数据库原有的一大堆数据reader和新加进来的数据pic合并到pic里面,所以利用Combination函数将两个矩阵合并,代码如下
def Combination(reader, pic):
'''将两个矩阵reader与pic合并'''
#两个矩阵的总行数
l = len(reader) + len(pic)
#初始化新的矩阵
newPic = np.zeros(l*10001).reshape(l, 10001)
#将reader最后的那个字符串名称去掉
for item in reader:
item.pop()
#将reader转化为numpy的矩阵形式
reader = np.array(reader)
#新矩阵前半部分放reader,后半部分放pic
if len(reader) != 0:
newPic[0:len(reader), :] = reader
newPic[len(reader):len(pic), :] = pic
return newPic
因为reader最后一行还包括了一个图片的名称,所以先利用pop将其去掉,之后转化为矩阵形式,然后再直接放入矩阵中。这个矩阵操作可能没有见过,下面我详细解释一下。
假如我现在有一个2x3的矩阵和一个2x2的矩阵
m = [[1 2 3]
[4 5 6]]
n = [[7 8]
[9 1]]
我可以进行如下操作
#操作一
m[:, 0:2] = n
print(m)
#操作二
m[:, 1:3] = n
print(m)
#以下为输出结果
#操作一
[[7 8 3]
[9 1 6]]
#操作二
[[7 7 8]
[9 9 1]]
可以看出操作一直接把m的第一二列给替换成n,操作二把m的第二三列替换成了n。具体过程可以百度查一下numpy的矩阵的操作,也可以自己总结规律,不细讲了。
以上就是这一篇的全部代码。
小结
这一篇我相当于用CSV文件制作了一个非常简陋的数据库,能够执行的操作只有识别已有内容NewFiles与添加内容SaveToCSV,并没有插入、删改等操作。主要是我觉得这两个函数目前已经够用,因此只写了这两个操作,所以再需求已经被满足的情况下就不再拓展了。
所有的源代码已经上传到了我的GitHub上,可以前去下载,谢谢阅读。
如果喜欢的话麻烦点一个喜欢哦,加关注可以得到超厉害的更新提醒。
python识别图片手写文字_Python徒手实现识别手写数字—简易图片数据库相关推荐
- python去除图片上的文字_Python图像处理之识别图像中的文字(实例讲解)
①安装PIL:pip install Pillow(之前的博客中有写过) ②安装pytesser3:pip install pytesser3 ③安装pytesseract:pip install p ...
- python识别图片指定位置文字_python批量识别图片指定区域文字内容
Python批量识别图片指定区域文字内容,供大家参考,具体内容如下 简介 对于一张图片,需求识别指定区域的内容 1.截取原始图上的指定图片当做模板 2.根据模板相似度去再原始图片上识别准确坐标 3.根 ...
- 不知道怎么识别手写文字?快来看这些手写文字识别成文档软件
平时在上课的时候,我们经常需要通过记笔记的方式将老师讲的课堂知识点记录下来,方便课后复习巩固.而有些勤奋的小伙伴为了能够时时刻刻进行复习,还会将纸质笔记整理成电子版便于日常查看.其实他们正是通过一些识 ...
- 基于Faster-RCNN的水书古籍手写文字的检测与识别-论文阅读
文章目录 论文基本信息 摘要 引言 1. 数据集 2. 目标检测算法的选取 3. 实验 论文基本信息 期刊: 厦门大学学报(自然科学版) .北大核心 IF = 0.77 出版时间:2022年3月 摘要 ...
- 微信小程序识别图片并提取文字_这款微信小程序可以批量图片转文字?识别准确率超高!...
在日常学习和生活中,我们都不乏会碰到那些需要将图片中的文字转换成可复制和编辑的内容的时候. 不管是书本还是电子文档又或者是电脑应用中的截图,其实都只要利用小编介绍的这个微信小程序就能轻松完成, 不仅能 ...
- 识别图片上的文字,如何在线识别?
如何在线识别图片上的文字?其实很简单的,我们借助一些工具就可以进行识别了.不会识别图片文字的小伙伴们,可以跟着小编一起来学习一下哈! 步骤一:首先我们就是要在电脑上,下载一款工具.下载安装完成识别图片 ...
- python显示竖着的文字_Python+OpenCV竖版古籍文字分割
在做图片文字分割的时候,常用的方法有两种.一种是投影法,适用于排版工整,字间距行间距比较宽裕的图像:还有一种是用OpenCV的轮廓检测,适用于文字不规则排列的图像. 1. 思路 一开始想偷个懒,直接用 ...
- python怎么封装方法然后调用_Python实现封装打包自己写的代码,被python import
1.新建一个文件夹example,里面放入要打包的.py文件,以及必需的_init_.py. 代码如下: # -*- coding: utf-8 -*- """ Crea ...
- java图片上传同时后台直接给MultipartFile对象添加图片水印或者文字水印,然后直接上传带水印的图片
本文只介绍给文件上传对象(MultipartFile )加水印,然后再进行文件上传的业务 话不多说,直接上代码,都是静态方法 1.图片水印 1.先上工画图片水印的方法 /*** 加图片水印 ** @p ...
- python计算2的平方代码_Python练习实例46 | 求输入数字的平方,如果平方运算后小于 50 则退出。...
这个问题,其实有两种计算的思路,第一种就是需要对结果进行判断,无非就是两种结果,一种结果为真,一种结果为假,将这两种结果分别赋值给1和0,然后创建一个while循环即可. 小黄人.jpg 实现的方式大 ...
最新文章
- Scrum企业实践-Leangoo敏捷工具
- 一个div 上下两行_纯CSS实现单一div的正多边形变换
- 2021年中国计算机视觉人才调研开启啦,诚邀各位开发者们参与~
- Angular相关的有价值的问题集锦
- RESTful JSON Web服务最佳实践
- 一般纳税人税额计算_一般纳税人企业缴税计算
- python正交表结果生成
- Android 图片压缩详解
- solidworks绘制齿轮、机械爪(齿轮设计基础知识)
- Activity类的7个生命周期方法
- 为什么要使用开关柜无线测温系统来对电气设备进行测温呢?如果没有开关柜无线测温系统会出现什么问题呢?
- 微信小程序订阅消息开发教程及代码(java后端实现)
- 数据库实验六---存储过程
- 用chatgpt做ppt
- 代码实现判断主机字节序(大端 or小端 )-- 面试题
- Luogu3426 [POI2005]SZA-Template (KMP)(未完成)
- 《秋波媚·七月十六日晚登高兴亭望长安南山》 陆游
- 打造原生的图文混排控件
- 万门大学MySQL特训班_如何评价万门大学「理论物理一月特训班」?
- MicroNet论文复现:用极低的FLOPs改进图像识别
热门文章
- kinect二次开发_Kinect2.0动作捕捉Super Mocap K2
- 信号量机制实现进程的互斥、同步、前驱
- x86系统引导(1)
- 农村环境保护学习资料
- Visual Studio调用约定 __cdecl、__stdcall和__fastcall
- NOIp2016纪录[那些我所追求的]
- 微信html5怎么制作,图文揭秘微信h5怎么制作-朋友圈微信H5页面制作方法
- Taro小程序 Input组件focus属性失效解决方案
- 基于混沌系统的文本加密算法研究(一)——混沌及混沌加密的基础知识
- android全面屏像素密度,手机屏幕分辨率、PPI像素密度科普知识大全