验证码识别我的Python自学之路程序员

Python 实现字符识别—Part3

2017-03-02  本文已影响236人  DayDayUpppppp

如果你看的比较困惑的话,可以参考
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

保存成单个字符后,下面就可以用机器学习或其他人工智能的方法来处理了。

上一篇 下一篇

猜你喜欢

热点阅读