Python 实现字符识别—Part3

作者: DayDayUpppppp | 来源:发表于2017-03-02 11:58 被阅读236次

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

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

    相关文章

      网友评论

      本文标题:Python 实现字符识别—Part3

      本文链接:https://www.haomeiwen.com/subject/kzphgttx.html