用BP人工神经网络识别手写数字.docVIP

  • 12
  • 0
  • 约4.65千字
  • 约 8页
  • 2017-02-01 发布于重庆
  • 举报
用BP人工神经网络识别手写数字

赖勇浩() 这是我读工程硕士的时候完成课程作业时做的,放在?dropbox?的角落中生尘已经有若干年头了,最近?@shugelee?同学突然来了兴致搞验证码识别,问到我的时候我记起自己做过一点点东西,特发上来给他参考,并趁机补充了一下《Python也可以》系列。 图像预处理使用下图(后方称为 SAMPLE_BMP)作为训练和测试数据来源,下文将讲述如何将图像转换为训练数据。 灰度化和二值化 在字符识别的过程中,识别算法不需要关心图像的彩色信息。因此,需要将彩色图像转化为灰度图像。经过灰度化处理后的图像中还包含有背景信息。因此,我们还得进一步处理,将背景噪声屏蔽掉,突显出字符轮廓信息。二值化处理就能够将其中的字符显现出来,并将背景去除掉。在一个[0,255]灰度级的灰度图像中,我们取 196 为该灰度图像的归一化值,代码如下: [python]view plaincopy def?convert_to_bw(im):?? ????im?=?im.convert(L)?? ????im.save(sample_L.bmp)?? ????im?=?im.point(lambda?x:?WHITE?if?x??196else?BLACK)?? ????im?=?im.convert(1)?? ????im.save(sample_1.bmp)?? return?im?? 下图是灰度化的图像,可以看到背景仍然比较明显,有一层淡灰色: 下图是二值化的图像,可以看到背景已经完全去除: 图片的分割和规范化: 通过二值化图像,我们可以分割出每一个字符为一个单独的图片,然后再计算相应的特征值,如下图所示: 这些图片是由程序自动进行分割而成,其中用到的代码片段如下: [python]view plaincopy def?split(im):?? assert?im.mode?==?1 ????result?=?[]?? ????w,?h?=?im.size?? ????data?=?im.load()牋 牋牋xs?燵0,?3,?7,?7,?06,?35,?59,?79,?05,?28,爓]牋 牋牋ys?燵0,?2,?0,?7,?50,爃]牋 for爄,爔爄n爀numerate(xs):牋 if爄???=爈en(xs):牋 break fo灰度化的图像,可以看到背景仍然比较明显,有一层淡灰色: r爅,爕爄n爀numerate(ys):牋 if爅???=爈en(ys):牋 break 牋牋牋牋牋牋box??x,爕,爔s[i+1],爕s[j+1])牋 牋牋牋牋牋牋t?爄m.crop(box).copy()牋 牋牋牋牋牋牋box?燽ox??(i??)??0,?牋 #牋牋牋牋牋爏ave_32_32(t,?num_%d_%d_%d_%d_%d%box) 牋牋牋牋牋牋result.append((normalize_32_32(t,?num_%d_%d_%d_%d_%d%box),?i??)??0))牋 return爎esult牋 其中的 xs 和 ys 分别是横向和竖向切割的分界点,由手工测试后指定,t = im.crop(box).copy() 代码行是从指定的区域中“抠”出图片,然后通过 normalize_32_32 进行规范化。进行规范化是为了产生规则的训练和测试数据集,也是为了更容易地地计算出特征码。 产生训练数据集和测试数据集 为简单起见,我们使用了最简单的图像特征——黑色像素在图像中的分布来进行训练和测试。首先,我们把图像规范化为 32*32 像素的图片,然后按 2*2 分切成 16*16 共 256 个子区域,然后统计这 4 个像素中黑色像素的个数,组成 256 维的特征矢量,如下是数字 2 的一个特征矢量: 0 0 4 4 4 2 0 0 0 0 0 0 0 0 2 4 0 0 4 4 4 2 0 0 0 0 0 0 0 0 2 4 2 2 4 4 2 1 0 0 0 0 0 0 1 2 3 4 4 4 4 4 0 0 0 0 0 0 0 0 2 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 2 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 2 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 2 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 2 2 2 2 2 2 2 4 4 2 3 4 4 4 4 4 4 4 4 4 4 4 4 4

文档评论(0)

1亿VIP精品文档

相关文档