最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python驗(yàn)證碼識(shí)別教程之利用投影法、連通域法分割圖片

 更新時(shí)間:2018年06月04日 11:24:50   作者:Hi!Roy!  
這篇文章主要給大家介紹了關(guān)于python驗(yàn)證碼識(shí)別教程之利用投影法、連通域法分割圖片的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧

前言

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

使用GIMP打開圖片后,按 加號(hào) 放大圖片,然后點(diǎn)擊View->Show Grid來顯示網(wǎng)格線:


其中,每個(gè)正方形邊長(zhǎng)為10像素,所以數(shù)字1切割坐標(biāo)為左20、上20、右40、下70。以此類推可以知道剩下3個(gè)數(shù)字的切割位置。

代碼如下:

from PIL import Image
p = Image.open("1.png")
# 注意位置順序?yàn)樽?、上、右、?
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) # 調(diào)用crop函數(shù)進(jìn)行切割
 temp.save("cut%s.png" % i)

切割后得到4張圖片:


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

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

def vertical(img):
 """傳入二值化后的圖片進(jìn)行垂直投影"""
 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 cuts

p = Image.open('1.png')
b_img = binarizing(p,200)
v = vertical(b_img)

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

輸出如下:

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

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

但是,對(duì)于字符間有粘連的情況,投影法就會(huì)出現(xiàn)拆分錯(cuò)誤,比如上篇文章中的:


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

[(5, 27), (33, 53), (59, 108)]

明顯最后的6和9數(shù)字沒有切割。

修改閾值為7,結(jié)果則是:

[(5, 27), (33, 53), (60, 79), (83, 108)]

所以對(duì)于簡(jiǎn)單粘連的情況,調(diào)整閾值也是可以解決的。

第二種方法,叫做CFS連通域分割法。原理就是假定每個(gè)字符都由一個(gè)單獨(dú)的連通域組成,換言之就是無粘連,找到一個(gè)黑色像素并開始判斷,直到所有相連的黑色像素都被遍歷標(biāo)記過后即可判斷出這個(gè)字符的分割位置。算法如下:

  • 將二值化后的圖片進(jìn)行從左到右、從上到下的遍歷,如果遇到黑色像素并且這個(gè)像素沒有沒訪問過,就將這個(gè)像素入棧并標(biāo)記為已經(jīng)訪問。
  • 如果棧不為空,則繼續(xù)探測(cè)周圍8個(gè)像素,并執(zhí)行第2步;如果??眨瑒t代表探測(cè)完了一個(gè)字符塊。
  • 探測(cè)結(jié)束,這樣就確定了若干字符。

代碼如下:

import queue

def cfs(img):
 """傳入二值化后的圖片進(jìn)行連通域分割"""
 pixdata = img.load()
 w,h = img.size
 visited = set()
 q = queue.Queue()
 offset = [(-1,-1),(0,-1),(1,-1),(-1,0),(1,0),(-1,1),(0,1),(1,1)]
 cuts = []
 for x in range(w):
  for y in range(h):
   x_axis = []
   #y_axis = []
   if pixdata[x,y] == 0 and (x,y) not in visited:
    q.put((x,y))
    visited.add((x,y))
   while not q.empty():
    x_p,y_p = q.get()
    for x_offset,y_offset in offset:
     x_c,y_c = x_p+x_offset,y_p+y_offset
     if (x_c,y_c) in visited:
      continue
     visited.add((x_c,y_c))
     try:
      if pixdata[x_c,y_c] == 0:
       q.put((x_c,y_c))
       x_axis.append(x_c)
       #y_axis.append(y_c)
     except:
      pass
   if x_axis:
    min_x,max_x = min(x_axis),max(x_axis)
    if max_x - min_x > 3:
     # 寬度小于3的認(rèn)為是噪點(diǎn),根據(jù)需要修改
     cuts.append((min_x,max_x))
 return cuts

調(diào)用后輸出結(jié)果和使用投影法是一樣的。另外我看網(wǎng)上還有一種叫做“泛洪填充(Flood Fill)”的方法,似乎和連通域是一樣的。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • TensorFlow 模型載入方法匯總(小結(jié))

    TensorFlow 模型載入方法匯總(小結(jié))

    這篇文章主要介紹了TensorFlow 模型載入方法匯總(小結(jié)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • python爬蟲增加訪問量的方法

    python爬蟲增加訪問量的方法

    這篇文章主要介紹了python爬蟲增加訪問量的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • python在windows和linux下獲得本機(jī)本地ip地址方法小結(jié)

    python在windows和linux下獲得本機(jī)本地ip地址方法小結(jié)

    這篇文章主要介紹了python在windows和linux下獲得本機(jī)本地ip地址方法,實(shí)例分析了Python獲得IP地址的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • Python的時(shí)間模塊datetime詳解

    Python的時(shí)間模塊datetime詳解

    本文給大家分享的是在python中的時(shí)間模塊datetime的使用方法,注意事項(xiàng)以及簡(jiǎn)單示例,有需要的小伙伴可以參考下
    2017-04-04
  • 淺談Python如何獲取excel數(shù)據(jù)

    淺談Python如何獲取excel數(shù)據(jù)

    這篇文章主要介紹了Python如何獲取excel數(shù)據(jù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • python如何實(shí)時(shí)獲取tcpdump輸出

    python如何實(shí)時(shí)獲取tcpdump輸出

    這篇文章主要介紹了python如何實(shí)時(shí)獲取tcpdump輸出,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-09-09
  • python實(shí)現(xiàn)跨進(jìn)程(跨py文件)通信示例

    python實(shí)現(xiàn)跨進(jìn)程(跨py文件)通信示例

    本文主要介紹了python實(shí)現(xiàn)跨進(jìn)程(跨py文件)通信示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • python使用Pycharm創(chuàng)建一個(gè)Django項(xiàng)目

    python使用Pycharm創(chuàng)建一個(gè)Django項(xiàng)目

    這篇文章主要介紹了python使用Pycharm創(chuàng)建一個(gè)Django項(xiàng)目,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • python安裝gdal的兩種方法

    python安裝gdal的兩種方法

    這篇文章主要介紹了python安裝gdal的兩種方法,每種方法給大家介紹的都非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Django 博客實(shí)現(xiàn)簡(jiǎn)單的全文搜索的示例代碼

    Django 博客實(shí)現(xiàn)簡(jiǎn)單的全文搜索的示例代碼

    這篇文章主要介紹了Django 博客實(shí)現(xiàn)簡(jiǎn)單的全文搜索的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02

最新評(píng)論

松溪县| 丘北县| 湟源县| 福州市| 馆陶县| 河东区| 阿克苏市| 耒阳市| 大埔县| 库车县| 房产| 青河县| 瑞丽市| 嘉禾县| 石首市| 营口市| 防城港市| 新丰县| 靖州| 丰都县| 丽水市| 东至县| 新安县| 永善县| 太谷县| 昌乐县| 淮滨县| 通渭县| 墨江| 高邮市| 慈溪市| 固阳县| 东辽县| 延长县| 大安市| 河间市| 河东区| 红原县| 万荣县| 米易县| 湖南省|