标签:
赖勇浩(
http://laiyonghao.com
)
这是我读工程硕士的时候完成课程作业时做的,
放在
dropbox
的角落中生尘已经有若干年
头了,
最近
@shugelee
同学突然来了兴致搞验证码识别,
问到我的时候我记起自己做过一
点点东西,特发上来给他参考,并趁机补充了一下《
Python
也可以》系列。
图像预处理
使用下图(后方称为
SAMPLE_BMP
)作为训练和测试数据来源,
下文将讲述如何将图像转换为训练数据。
灰度化和二值化
在字符识别的过程中,
识别算法不需要关心图像的彩色信息。
因此,
需要将彩色图像转化为
灰度图像。
经过灰度化处理后的图像中还包含有背景信息。
因此,我们还得进一步处理,
将
背景噪声屏蔽掉,
突显出字符轮廓信息。
二值化处理就能够将其中的字符显现出来,
并将背
景去除掉。在一个
[0
,
255]
灰度级的灰度图像中,我们取
196
为该灰度图像的归一化值,
代码如下:
[python]
view plaincopy
1.
def
convert_to_bw(im):
2.
im = im.convert("L")
3.
im.save("sample_L.bmp")
4.
im = im.point(
lambda
x: WHITE
if
x > 196
else
BLACK)
5.
im = im.convert(‘1‘)
6.
im.save("sample_1.bmp")
7.
return
im
下图是灰度化的图像,可以看到背景仍然比较明显,有一层淡灰色:
下图是二值化的图像,可以看到背景已经完全去除:
图片的分割和规范化:
通过二值化图像,
我们可以分割出每一个字符为一个单独的图片,
然后再计算相应的特征值,
如下图所示:
这些图片是由程序自动进行分割而成,其中用到的代码片段如下:
[python]
view plaincopy
1.
def
split(im):
2.
assert
im.mode == ‘1‘
3.
result = []
4.
w, h = im.size
5.
data = im.load()
6.
xs = [0, 23, 57, 77, 106, 135, 159, 179, 205, 228, w]
7.
ys = [0, 22, 60, 97, 150, h]
8.
for
i, x
in
enumerate(xs):
9.
if
i + 1 >= len(xs):
10.
break
11.
for
j, y
in
enumerate(ys):
12.
if
j + 1 >= len(ys):
13.
break
标签:
原文地址:http://www.cnblogs.com/delphi-xe5/p/5840719.html