国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python驗證碼識別教程之利用投影法、連通域法分割圖片

2020-02-15 21:37:34
字體:
來源:轉載
供稿:網友

前言

今天這篇文章主要記錄一下如何切分驗證碼,用到的主要庫就是Pillow和Linux下的圖像處理工具GIMP。首先假設一個固定位置和寬度、無粘連、無干擾的例子學習一下如何使用Pillow來切割圖片。

使用GIMP打開圖片后,按 加號 放大圖片,然后點擊View->Show Grid來顯示網格線:


其中,每個正方形邊長為10像素,所以數字1切割坐標為左20、上20、右40、下70。以此類推可以知道剩下3個數字的切割位置。

代碼如下:

from PIL import Imagep = Image.open("1.png")# 注意位置順序為左、上、右、下cuts = [(20,20,40,70),(60,20,90,70),(100,10,130,60),(140,20,170,50)]for i,n in enumerate(cuts,1): temp = p.crop(n) # 調用crop函數進行切割 temp.save("cut%s.png" % i)

切割后得到4張圖片:


那么,如果字符位置不固定怎么辦呢?現在假設一種隨機位置寬度、無粘連、無干擾線的情況。

第一種方法,也是最簡單的方法叫做”投影法”。原理就是將二值化后的圖片在豎直方向進行投影,根據投影后的極值來判斷分割邊界。這里我依然使用上面的驗證碼圖片來進行演示:

def vertical(img): """傳入二值化后的圖片進行垂直投影""" pixdata = img.load() w,h = img.size ver_list = [] # 開始投影 for x in range(w): black = 0 for y in range(h):  if pixdata[x,y] == 0:  black += 1 ver_list.append(black) # 判斷邊界 l,r = 0,0 flag = False cuts = [] for i,count in enumerate(ver_list): # 閾值這里為0 if flag is False and count > 0:  l = i  flag = True if flag and count == 0:  r = i-1  flag = False  cuts.append((l,r)) return cutsp = Image.open('1.png')b_img = binarizing(p,200)v = vertical(b_img)

通過vertical函數我們就得到了一個包含所有黑色像素在X軸上投影后左右邊界的位置。由于驗證碼沒有任何干擾,所以我的閾值設定為0。 關于binarizing函數可以參考上一篇文章

輸出如下:

[(21, 37), (62, 89), (100, 122), (146, 164)]

可以看到,投影法給出左右邊界和我們手工查看得到很接近。對于上下邊界,偷懶的可以直接使用0和圖片的高度,也可以在水平方向進行投影,這里有興趣的小伙伴可以自己嘗試。

但是,對于字符間有粘連的情況,投影法就會出現拆分錯誤,比如上篇文章中的:


修改閾值為5后,投影法給出的左右邊界是:

[(5, 27), (33, 53), (59, 108)]            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 仙游县| 乌兰县| 沽源县| 安仁县| 宁强县| 无棣县| 山西省| 罗山县| 海丰县| 灵武市| 大邑县| 安岳县| 兴义市| 泌阳县| 定远县| 岳池县| 怀远县| 晋州市| 昭平县| 彩票| 甘泉县| 渭南市| 拜泉县| 临高县| 玉林市| 革吉县| 汉沽区| 淳化县| 沅陵县| 禹州市| 全椒县| 黄骅市| 台江县| 宁晋县| 腾冲县| 建湖县| 巨鹿县| 临朐县| 合阳县| 蒙城县| 康定县|