1. 程式人生 > >基於SVM的python簡單實現驗證碼識別

基於SVM的python簡單實現驗證碼識別

save def lse highlight pro imp bubuko uac 如果

1. 爬取驗證碼圖片

from urllib import request


def download_pics(pic_name):
    url = ‘http://wsbs.zjhz.hrss.gov.cn/captcha.svl‘
    res = request.urlopen(url)
    get_img = res.read()

    with open(‘/Users/luacheng/project/python/image/vcode/%s.jpg‘ % (pic_name), ‘wb‘) as f:
        f.write(get_img)


if __name__ == ‘__main__‘:
    for i in range(100):
        pic_name = i
        download_pics(pic_name)

 技術分享圖片

2. 二值化

接下來要做的工作就是二值化驗證碼,所謂二值化,就是將每一個像素點用0或1來表示,圖像的每個像素點都有rgb三個值,我們首先轉化成灰度圖,這樣每個像素點就只有一個灰度值了。接下來根據自己設定的閾值來確定每個像素點是該為0還是為1。

我的思路是首先將圖像轉化為array處理,當然完全可以直接圖像處理。

from PIL import Image
import numpy


def binarization(im):  # 二值化
    imgry = im.convert(‘L‘)
    imgry = numpy.array(imgry)  # 將圖像轉化為數組
    height, width = imgry.shape
    f = open(‘1.txt‘, ‘w‘)
    for i in range(height):
        for j in range(width):
            gray = imgry[i, j]
            if gray <= 220:  # 閾值設為220
                imgry[i, j] = 0
            else:
                imgry[i, j] = 1
            f.write(str(imgry[i,j]))  #輸出到txt查看
        f.write(‘\n‘)
    ‘‘‘
    plt.figure(‘‘)
    plt.imshow(imgry, cmap=‘gray‘)
    plt.axis(‘off‘)
    plt.show()
    ‘‘‘
    return imgry


if __name__ == ‘__main__‘:
    img = Image.open(‘/Users/luacheng/project/python/image/vcode/1.jpg‘)
    binarization(img)

在二值化處理之後,處理結果如下所示:

技術分享圖片

技術分享圖片

3 圖片分割

接下來要做的就是將這四個字符分割開來形成訓練集,這個操作並不難。因為這些驗證碼的位置都是差不多的,如果驗證碼字符位置比較亂的話就會比較麻煩

 1 def cutImg(img):  #圖像切割
 2     s = 12
 3     w = 40
 4     h = 81
 5     t = 0
 6     cut_img = []
 7     for i in range(4):
 8         pic = img.crop((s + w * i, t, s + w * (i + 1), h))
 9         cut_img.append(pic)
10 return cut_img

技術分享圖片

4 圖片分類

這個步驟的目的就是人為的給訓練集打上標簽。 將相同的數字放在同一個文件夾下面

技術分享圖片

5 訓練模型

訓練模型很簡單,因為直接就是使用libsvm庫,我們只需要按照數據格式生成一些特征值即可

 1 import os
 2 from PIL import *
 3 from PIL import Image
 4 import numpy as np
 5 from libsvm.python.svmutil import *
 6 from libsvm.python.svm import *
 7 
 8 
 9 address = D:\python\驗證碼-sort\\
10 f = open(train.txt, w)
11 
12 def get_feature(dir, file):
13     f.write(dir)
14     im = Image.open(address + dir +\\ + file)
15     imarr = np.array(im)
16     height, width = imarr.shape
17     for i in range(height):
18         for j in range(width):
19             gray = imarr[i,j]
20             if gray <= 150:
21                 imarr[i, j] = 0
22             else:
23                 imarr[i, j] = 255
24     im = Image.fromarray(imarr)
25     count = 0
26     width, height = im.size
27     for i in range(height):
28         c = 0
29         for j in range(width):
30             if im.getpixel((j, i)) == 0: c += 1
31         f.write( %d:%d%(count, c))
32         count += 1
33     for i in range(width):
34         c = 0
35         for j in range(height):
36             if im.getpixel((i, j)) == 0: c += 1
37         f.write( %d:%d%(count, c))
38         count += 1
39     f.write(\n)
40 
41 def train_svm_model():
42     y, x = svm_read_problem(train.txt)
43     model = svm_train(y, x)
44     svm_save_model(model_file, model)
45 
46 if __name__ == __main__:
47     dirs = os.listdir(address)
48     for dir in dirs:
49         files = os.listdir(address + dir)
50         for file in files:
51             get_feature(dir, file)
52     train_svm_model()

6 測試模型

用測試數據對模型進行測試

1 from libsvm.python.svmutil import *
2 from libsvm.python.svm import *
3 import image_slove
4 
5 if __name__ == __main__:
6     model = svm_load_model(model_file)
7     yt, xt = svm_read_problem(test.txt)
8     p_label, p_acc, p_val = svm_predict(yt, xt, model)

基於SVM的python簡單實現驗證碼識別