写在前面
在上一篇文章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。
新闻热点
疑难解答