基於SVM的python簡單實現驗證碼識別
阿新 • • 發佈:2018-08-08
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簡單實現驗證碼識別