手写数字识别系统编程技巧

来源:互联网 发布:淘宝客怎么关闭掉 编辑:程序博客网 时间:2024/06/18 11:18

手写数字识别系统编程技巧

之前,我写过一篇文章Python实现手写识别系统http://blog.csdn.net/louishao/article/details/60867339。这个实际上是我最近完成的本科毕业论文的课题。

本文就在那篇文章的基础上,总结当中的编程技巧,主要是图像处理和tkinter的编程。注意:本文写的编程技巧,仅针对之前的文章而言,并非是系统的讲解!


1 图像处理编程技巧

手写数字的预处理,我设计的系统中,包含了整形,灰度化和像素值的归一化。当然,我的论文课题重点不是图像处理,因此,这里我基本用的python第三方库PIL实现的。

整形、灰度化、像素值归一化的编程实现

# reshapedef reshapepic(pic):    im = Image.open(pic)    if im.size!=(28,28):        im = im.resize((28,28))#,Image.ANTIALIAS)    return im# grayingdef graypic(pic):    if pic.mode!='L':        pic = pic.convert('L')    return pic# normalizationdef normalizepic(pic):    im_arr = list(pic.getdata())    im_nparr = []    for x in im_arr:        x=1-x/255        im_nparr.append(x)    im_nparr = np.array([im_nparr])    return im_nparr,pic

**说明:**mnist中的图像都是28×28的,因此,使用reshapepic()将输入的图片整形为28×28的;同时训练图像是黑白的,因此,使用gray()进行灰度化;而且,训练图像的像素值都是在0-1之间的,因此需要归一化。


2 tkinter编程技巧

我本身对tkinter懂得不多,也只是懂一些很基础的编程,但通过之前手写识别系统的GUI实现后,自己学习了很多,现在作个总结。

很基础的构建控件,添加命令,我这里没有提及,主要是写一些,实用的技巧。

2.1 tkinter中的menu

我实现的系统中,含有’OpenFile’的菜单。实现如下:(这里是从我的整个项目文件上截取的,我采用面向对象的写法)

# ------Menu--------------------self.menubar = Menu(self.root)self.root.config(menu=self.menubar)self.menubar.add_command(label='OpenFile',command=self.openfile)self.piccan = Canvas(self.numberrec,                             width=168,height=168,bg='#f2f2f2')self.root['menu']=self.menubarself.piccan.grid(row=2,column=0,rowspan=3)

打开图片后,使用一个Canvas来显示图片

# ------ Menu function --------------------------------------def openfile(self):    try:        fname = td.askopenfilename(title="open", filetypes=[('Image','*.png'),('Image','*.bmp'), ('All Files', '*')])        self.imagepath.set(fname)        self.showimage()        #del(self.im_nparr)        self.reshbutton['state']='normal'    except AttributeError:        tb.showwarning('Warining',"You haven't import any images!")    except IOError:        tb.showwarning('Warining',"You should import an image!")# ------- function to show image ------------------------------def showimage(self):    self.__img = Image.open(self.imagepath.get())    #print(self.__img)    self.__photo = ImageTk.PhotoImage(self.__img)    self.piccan.create_image((84,84),image=self.__photo)

最后实现的结果,就是在菜单上导入图片,可以在一个Canvas的中间位置显示。


2.2 tkinter中的scrolledtext编程技巧

scrolledtext是将滚动轴和文本控件结合在一起,这样,使用起来更方便。

我的系统使用scrolledtext是用于显示各种信息的,类似很多集成系统的Console框的使用。

功能实现:

self.trainmsg = ScrolledText(self.train,font=("Microsoft YaHei",10),width=40,height=15,padx=5,pady=5)self.trainmsg.grid(column=0,row=0,padx=5,pady=5)

这样,就能设置显示文本的字体和大小,以及这个控件的长和宽。

编写在ScrolledText中显示文本的函数,如下:

self.message = StringVar(self.root)def printt(self,msg):        self.message.set(msg+"\n")        self.trainmsg.insert(INSERT,self.message.get())        self.trainmsg.see(END)

ScrolledText的使用关键在于printt()的函数上。insert()是用于插入要显示的文本,see(END)是当显示内容超过文本框的时候,自动滑到最下方。


2.3 tkinter中的Canvas编程技巧

对于Canvas控件,有一个方法很使用,就是delete(“all”),它能清空当前Canvas显示的图像,一定程度上能起到刷新的作用。


总结:做整个项目之前,我自己基本上都不知道怎么实现界面。但是,自己不断地尝试,写了很多很多的测试文件,自己也查了很多资料,但是网上tkinter的资料比较少,而且很多都只是很基础的教程,所以我还看了一部分的tkinter官方文档。总的来说,用了一个月写界面,学了很多,自己之前写过MATLAB的GUI,现在有写了python的,感觉自己对GUI的编程有一点小心得,也对编程有了信心。最终把自己既定的功能都写出来了,也很有满足感,继续努力!

0 0
原创粉丝点击