如果你看的比较困惑的话,可以参考
Python 实现字符识别—Part1:关于PIL库的使用
http://www.jianshu.com/p/0a94d8ea2bf3
Python 实现字符识别—Part2:关于图形格式的基础知识和我的一个问题(欢迎大神来指点迷津)
http://www.jianshu.com/p/252ff113d1d0
Python 实现字符识别—Part3:关于完成验证码识别的前置操作,字符的提取和图像的分割
http://www.jianshu.com/p/4ff1559c1cf6
Python 实现字符识别—Part4 : 关于空间向量搜索算法paper的介绍
http://www.jianshu.com/p/b13b3905cc7d
Python 实现字符识别—Part5:关于使用空间向量搜索算法实现字符识别
http://www.jianshu.com/p/1905bf78f0bd
实现验证码的识别。
这一部分写的是,如果将一张验证码做一个基本的出来,然后切分成单个的字符。切分为单个的字符之后,就可以用机器学习,深度学习的方法来处理了。
验证码如下:
captcha.gif
切分之后:
6cfae00a3885ac953259737d39322c40.gif
08dcd88f635d6b3473f712706971c79a.gif
9abd605809d1f53aacf2179dd917ee7f.gif
52d99fe62c87df1a17a4a4dfaf4a9a26.gif
75bbc019ca226b60057df5e3cd595acf.gif
85d9dc1db27c9ee3c7463aeb3c7728bf.gif image.png
第一部分 先把 红色字符和其他颜色作为背景的验证码,转换为一张灰度图。黑色是字体,白色是背景。
captcha.gif 222.gif#coding:utf-8
import hashlib
import time
from PIL import Image
im=Image.open('captcha.gif')
#im = Image.open("captcha.gif")
#(将图片转换为8位像素模式)
im.convert("P")
im.show()
#測試代碼
#for xx in range(30):
# for yy in range(30):
# pix=im.getpixel((xx,yy))
# print pix
#打印颜色直方图
#很坐標是0-255,表示P模式下面的0-255種顏色,縱坐標是表示圖片中對應的每個顏色的像素個數
print im.histogram()
his=im.histogram()
#dict 創建一個字典,來保存圖片裏面的像素分布
values={}
for i in range(256):
values[i]=his[i]
#給dict排序,然後保存前10名
lists=sorted(values.items(),key=lambda x:x[1],reverse=True)[:10]
#l[0]是0-255中的一樣顏色,比如255是白色,l[1] 是對應的像素的個數
for l in lists:
print l[0],l[1]
#創建pic2
#以一個像素8bit的,大小是Im.size 背景顏色是255 白色
im2=Image.new("P",im.size,255)
for x in range(im.size[1]):
for y in range(im.size[0]):
pix=im.getpixel((y,x))
#220 227 解釋一下 就是將紅色的像素 變成黑色
if pix ==220 or pix==227:
im2.putpixel((y,x),0)
#現在這張圖片是一張黑白的圖片,黑色是字符,白色是背景
#im2.show()
#嘗試着保存成jpg格式,結果失敗 原因 cannot write mode P as JPEG
#image = Image.new('RGB', (width, height), (255, 255, 255))
#好像這樣的才可以
#記得以前數字圖像這門課好像講過 但是全tmd忘了
im2.save('222.gif','gif')
<br />
然后下面一部分是 将灰度图切割成单个的字符
#得到單個的字符,纵向切割圖片
#size[0]是長
#size[1]是寬
#縱向遍歷圖片 找到每個字符的起始的位置
inletter = False
foundletter=False
start = 0
end = 0
letters = []
for y in range(im2.size[0]):
for x in range(im2.size[1]):
pix=im2.getpixel((y,x))
if pix != 255:
inletter = True
if foundletter == False and inletter == True:
foundletter = True
start = y
if foundletter == True and inletter == False:
foundletter = False
end = y
letters.append((start,end))
inletter=False
print letters
#將分割後的圖片保存
count = 0
for letter in letters:
m = hashlib.md5()
im3 = im2.crop(( letter[0] , 0, letter[1],im2.size[1] ))
m.update("%s%s"%(time.time(),count))
im3.save("./%s.gif"%(m.hexdigest()))
count += 1
结果就是单个字符被保存到文件:
image.png
保存成单个字符后,下面就可以用机器学习或其他人工智能的方法来处理了。
网友评论