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

python驗證碼識別的示例代碼

 更新時間:2017年09月21日 09:31:09   作者:Hi!Roy!  
本篇文章主要介紹了python驗證碼識別的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

寫爬蟲有一個繞不過去的問題就是驗證碼,現(xiàn)在驗證碼分類大概有4種:

  • 圖像類
  • 滑動類
  • 點擊類
  • 語音類

今天先來看看圖像類,這類驗證碼大多是數(shù)字、字母的組合,國內也有使用漢字的。在這個基礎上增加噪點、干擾線、變形、重疊、不同字體顏色等方法來增加識別難度。

相應的,驗證碼識別大體可以分為下面幾個步驟:

  • 灰度處理
  • 增加對比度(可選)
  • 二值化
  • 降噪
  • 傾斜校正分割字符
  • 建立訓練庫
  • 識別

由于是實驗性質的,文中用到的驗證碼均為程序生成而不是批量下載真實的網站驗證碼,這樣做的好處就是可以有大量的知道明確結果的數(shù)據(jù)集。

當需要真實環(huán)境下需要獲取數(shù)據(jù)時,可以使用結合各個大碼平臺來建立數(shù)據(jù)集進行訓練。

生成驗證碼這里我使用Claptcha這個庫,當然Captcha這個庫也是個不錯的選擇。

為了生成最簡單的純數(shù)字、無干擾的驗證碼,首先需要將claptcha.py的285行_drawLine做一些修改,我直接讓這個函數(shù)返回None,然后開始生成驗證碼:

from claptcha import Claptcha
c = Claptcha("8069","/usr/share/fonts/truetype/freefont/FreeMono.ttf")
t,_ = c.write('1.png')

這里需要注意ubuntu的字體路徑,也可以在網上下載其他字體使用。生成驗證碼如下:

 

可以看出,驗證碼有形變。對于這類最簡單的驗證碼,可以直接使用谷歌開源的tesserocr來識別。

首先安裝:

apt-get install tesseract-ocr libtesseract-dev libleptonica-dev
pip install tesserocr

然后開始識別:

from PIL import Image
import tesserocr
p1 = Image.open('1.png')
tesserocr.image_to_text(p1)
'8069\n\n'

可以看出,對于這種簡單的驗證碼,基本什么都不做識別率就已經很高了。有興趣的小伙伴可以用更多的數(shù)據(jù)來測試,這里我就不展開了。

接下來,在驗證碼背景添加噪點來看看:

c = Claptcha("8069","/usr/share/fonts/truetype/freefont/FreeMono.ttf",noise=0.4)
t,_ = c.write('2.png')

生成驗證碼如下:

 

識別:

p2 = Image.open('2.png')
tesserocr.image_to_text(p2)
'8069\n\n'

效果還可以。接下來生成一個字母數(shù)字組合的:

c2 = Claptcha("A4oO0zZ2","/usr/share/fonts/truetype/freefont/FreeMono.ttf")
t,_ = c2.write('3.png')

生成驗證碼如下:

 

第3個為小寫字母o,第4個為大寫字母O,第5個為數(shù)字0,第6個為小寫字母z,第7個為大寫字母Z,最后一個是數(shù)字2。人眼已經跪了有木有!但現(xiàn)在一般驗證碼對大小寫是不做嚴格區(qū)分的,看自動識別什么樣吧:

p3 = Image.open('3.png')
tesserocr.image_to_text(p3)
'AMOOZW\n\n'

人眼都跪的計算機當然也廢了。但是,對于一些干擾小、形變不嚴重的,使用tesserocr還是十分簡單方便的。然后將修改的claptcha.py的285行_drawLine還原,看添加干擾線的情況。

 

p4 = Image.open('4.png')
tesserocr.image_to_text(p4)

加了條干擾線就完全識別不出來了,那么有沒有什么辦法去除干擾線呢?

雖然圖片看上去是黑白的,但還需要進行灰度處理,否則使用load()函數(shù)得到的是某個像素點的RGB元組而不是單一值了。處理如下:

def binarizing(img,threshold):
 """傳入image對象進行灰度、二值處理"""
 img = img.convert("L") # 轉灰度
 pixdata = img.load()
 w, h = img.size
 # 遍歷所有像素,大于閾值的為黑色
 for y in range(h):
  for x in range(w):
   if pixdata[x, y] < threshold:
    pixdata[x, y] = 0
   else:
    pixdata[x, y] = 255
 return img

處理后的圖片如下:

 

可以看出處理后圖片銳化了很多,接下來嘗試去除干擾線,常見的4鄰域、8鄰域算法。所謂的X鄰域算法,可以參考手機九宮格輸入法,按鍵5為要判斷的像素點,4鄰域就是判斷上下左右,8鄰域就是判斷周圍8個像素點。如果這4或8個點中255的個數(shù)大于某個閾值則判斷這個點為噪音,閾值可以根據(jù)實際情況修改。

def depoint(img):
 """傳入二值化后的圖片進行降噪"""
 pixdata = img.load()
 w,h = img.size
 for y in range(1,h-1):
  for x in range(1,w-1):
   count = 0
   if pixdata[x,y-1] > 245:#上
    count = count + 1
   if pixdata[x,y+1] > 245:#下
    count = count + 1
   if pixdata[x-1,y] > 245:#左
    count = count + 1
   if pixdata[x+1,y] > 245:#右
    count = count + 1
   if pixdata[x-1,y-1] > 245:#左上
    count = count + 1
   if pixdata[x-1,y+1] > 245:#左下
    count = count + 1
   if pixdata[x+1,y-1] > 245:#右上
    count = count + 1
   if pixdata[x+1,y+1] > 245:#右下
    count = count + 1
   if count > 4:
    pixdata[x,y] = 255
 return img

處理后的圖片如下:

 

好像……根本沒卵用???!確實是這樣的,因為示例中的圖片干擾線的寬度和數(shù)字是一樣的。對于干擾線和數(shù)據(jù)像素不同的,比如Captcha生成的驗證碼:

 

從左到右依次是原圖、二值化、去除干擾線的情況,總體降噪的效果還是比較明顯的。另外降噪可以多次執(zhí)行,比如我對上面的降噪后結果再進行依次降噪,可以得到下面的效果:

 

再進行識別得到了結果:

p7 = Image.open('7.png')
tesserocr.image_to_text(p7)
'8069 ,,\n\n'

另外,從圖片來看,實際數(shù)據(jù)顏色明顯和噪點干擾線不同,根據(jù)這一點可以直接把噪點全部去除,這里就不展開說了。

第一篇文章,先記錄如何將圖片進行灰度處理、二值化、降噪,并結合tesserocr來識別簡單的驗證碼,剩下的部分在下一篇文章中和大家一起分享。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python序列的推導式實現(xiàn)代碼

    Python序列的推導式實現(xiàn)代碼

    推導式是可以從一個數(shù)據(jù)序列構建另一個新的數(shù)據(jù)序列(的一種結構體),是python的一種獨有特性,在python中共有三種推導,列表推導式和字典推導式,集合推導式,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2021-07-07
  • 基于PyQt5完成pdf轉word功能

    基于PyQt5完成pdf轉word功能

    本文介紹的pdf轉word功能還有一些待完善地方,例如可增加預覽功能,實現(xiàn)每頁預覽,當然我們可以在后續(xù)階段逐漸完善,對基于PyQt5完成的pdf轉word功能感興趣的朋友一起看看吧
    2022-06-06
  • 基于Python制作B站視頻下載小工具

    基于Python制作B站視頻下載小工具

    這篇文章主要為大家介紹一個小工具,可以用于B站視頻的下載,只需要輸入對應視頻的網頁地址就可以進行下載到本地了。感興趣的可以了解一下
    2022-01-01
  • 解決pytorch 模型復制的一些問題

    解決pytorch 模型復制的一些問題

    這篇文章主要介紹了解決pytorch 模型復制的一些問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • python中flatten()參數(shù)示例詳解

    python中flatten()參數(shù)示例詳解

    flatten是numpy.ndarray.flatten的一個函數(shù),即返回一個一維數(shù)組,這篇文章主要給大家介紹了關于python中flatten()參數(shù)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • Python開啟線程,在函數(shù)中開線程的實例

    Python開啟線程,在函數(shù)中開線程的實例

    今天小編就為大家分享一篇Python開啟線程,在函數(shù)中開線程的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • 學習python (2)

    學習python (2)

    學習python (2)...
    2006-10-10
  • Python清理數(shù)據(jù)的八種常用方法

    Python清理數(shù)據(jù)的八種常用方法

    在本文中,我們將介紹Python中一些常用的數(shù)據(jù)清理方法,包括數(shù)據(jù)預覽、缺失值處理、異常值處理、數(shù)據(jù)類型轉換、重復值處理、數(shù)據(jù)標準化、特征選擇以及處理類別數(shù)據(jù),感興趣的可以了解一下
    2023-11-11
  • Python?迭代器和生成器概念及場景分析

    Python?迭代器和生成器概念及場景分析

    yield 是 Python 中實現(xiàn)惰性計算和協(xié)程的核心工具,結合 send()、throw()、close() 等方法,能夠構建高效、靈活的數(shù)據(jù)流和控制流模型,這篇文章主要介紹了Python?迭代器和生成器概念,需要的朋友可以參考下
    2025-04-04
  • 在pyCharm中下載第三方庫的方法

    在pyCharm中下載第三方庫的方法

    這篇文章主要介紹了在pyCharm中下載第三方庫的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04

最新評論

涪陵区| 曲沃县| 关岭| 丘北县| 景德镇市| 泊头市| 正蓝旗| 新蔡县| 曲周县| 鄱阳县| 呈贡县| 城步| 南华县| 怀仁县| 桂东县| 秦安县| 富平县| 兰西县| 玉田县| 永年县| 山东省| 石狮市| 高雄市| 东乡县| 五原县| 遵义县| 聊城市| 清徐县| 湘西| 靖宇县| 静宁县| 陆良县| 南宫市| 华安县| 繁峙县| 年辖:市辖区| 彰化市| 巢湖市| 剑阁县| 申扎县| 合水县|