首页 > 编程 > Python > 正文

Python实现识别手写数字 Python图片读入与处理

2020-02-22 23:02:42
字体:
来源:转载
供稿:网友

写在前面

在上一篇文章Python徒手实现手写数字识别—大纲中,我们已经讲过了我们想要写的全部思路,所以我们不再说全部的思路。

我这一次将图片的读入与处理的代码写了一下,和大纲写的过程一样,这一段代码分为以下几个部分:

读入图片; 将图片读取为灰度值矩阵; 图片背景去噪; 切割图片,得到手写数字的最小矩阵; 拉伸/压缩图片,得到标准大小为100x100大小矩阵; 将图片拉为1x10000大小向量,存入训练矩阵中。

所以下面将会对这几个函数进行详解。

代码分析

基础内容

首先我们现在最前面定义基础变量

import osfrom skimage import ioimport numpy as np##Essential vavriable 基础变量#Standard size 标准大小N = 100#Gray threshold 灰度阈值color = 100/255

其中标准大小指的是我们在最后经过切割、拉伸后得到的图片的尺寸为NxN。灰度阈值指的是在某个点上的灰度超过阈值后则变为1.

接下来是这图像处理的一部分的主函数

filenames = os.listdir(r"./num/")pic = GetTrainPicture(filenames)

其中filenames得到在num目录下所有文件的名称组成的列表。pic则是通过函数GetTrainPicture得到所有训练图像向量的矩阵。这一篇文章主要就是围绕这个函数进行讲解。

GetTrainPicture函数

GetTrainPicture函数内容如下

#Read and save train picture 读取训练图片并保存def GetTrainPicture(files): Picture = np.zeros([len(files), N**2+1]) #loop all pictures 循环所有图片文件 for i, item in enumerate(files):  #Read the picture and turn RGB to grey 读取这个图片并转为灰度值  img = io.imread('./num/'+item, as_grey = True)  #Clear the noise 清除噪音  img[img>color] = 1  #Cut the picture and get the picture of handwritten number  #将图片进行切割,得到有手写数字的的图像  img = CutPicture(img)  #Stretch the picture and get the standard size 100x100  #将图片进行拉伸,得到标准大小100x100  img = StretchPicture(img).reshape(N**2)  #Save the picture to the matrix 将图片存入矩阵  Picture[i, 0:N**2] = img  #Save picture's name to the matrix 将图片的名字存入矩阵  Picture[i, N**2] = float(item[0]) return Picture

可以看出这个函数的信息量非常大,基本上今天做的所有步骤我都把封装到一个个函数里面了,所以这里我们可以看到图片处理的所有步骤都在这里。

提前准备

首先是创建了一个用来存放所有图像向量的矩阵Picture,大小为fx10001,其中f代表我们拥有的训练图片的数目,10001的前10000位代表图片展开后的向量长度,最后一维代表这一个向量的类别,比如说时2就代表这个图片上面写的数字是2.

接下来用的是一个for循环,将files里面每一个图片进行一次迭代,计算出向量后存入picture。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表