欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python驗(yàn)證碼識(shí)別教程之灰度處理、二值化、降噪與tesserocr識(shí)別

 更新時(shí)間:2018年06月04日 11:04:52   作者:Hi!Roy!  
這篇文章主要給大家介紹了關(guān)于python驗(yàn)證碼識(shí)別教程之灰度處理、二值化、降噪與tesserocr識(shí)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

  1. 圖像類
  2. 滑動(dòng)類
  3. 點(diǎn)擊類
  4. 語音類

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

相應(yīng)的,驗(yàn)證碼識(shí)別大體可以分為下面幾個(gè)步驟:

  1. 灰度處理
  2. 增加對(duì)比度(可選)
  3. 二值化
  4. 降噪
  5. 傾斜校正分割字符
  6. 建立訓(xùn)練庫(kù)
  7. 識(shí)別

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

當(dāng)需要真實(shí)環(huán)境下需要獲取數(shù)據(jù)時(shí),可以使用結(jié)合各個(gè)大碼平臺(tái)來建立數(shù)據(jù)集進(jìn)行訓(xùn)練。

生成驗(yàn)證碼這里我使用Claptcha (本地下載)這個(gè)庫(kù),當(dāng)然Captcha本地下載)這個(gè)庫(kù)也是個(gè)不錯(cuò)的選擇。

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

from claptcha import Claptcha

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

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


可以看出,驗(yàn)證碼有形變。對(duì)于這類最簡(jiǎn)單的驗(yàn)證碼,可以直接使用谷歌開源的tesserocr來識(shí)別。

首先安裝:

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

然后開始識(shí)別:

from PIL import Image
import tesserocr

p1 = Image.open('1.png')
tesserocr.image_to_text(p1)

'8069\n\n'

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

接下來,在驗(yàn)證碼背景添加噪點(diǎn)來看看:

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

生成驗(yàn)證碼如下:


識(shí)別:

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

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

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

生成驗(yàn)證碼如下:

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

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

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

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

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

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

def binarizing(img,threshold):
 """傳入image對(duì)象進(jìn)行灰度、二值處理"""
 img = img.convert("L") # 轉(zhuǎn)灰度
 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鄰域算法,可以參考手機(jī)九宮格輸入法,按鍵5為要判斷的像素點(diǎn),4鄰域就是判斷上下左右,8鄰域就是判斷周圍8個(gè)像素點(diǎn)。如果這4或8個(gè)點(diǎn)中255的個(gè)數(shù)大于某個(gè)閾值則判斷這個(gè)點(diǎn)為噪音,閾值可以根據(jù)實(shí)際情況修改。

def depoint(img):
 """傳入二值化后的圖片進(jìn)行降噪"""
 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í)是這樣的,因?yàn)槭纠械膱D片干擾線的寬度和數(shù)字是一樣的。對(duì)于干擾線和數(shù)據(jù)像素不同的,比如Captcha生成的驗(yàn)證碼:

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


再進(jìn)行識(shí)別得到了結(jié)果:

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

另外,從圖片來看,實(shí)際數(shù)據(jù)顏色明顯和噪點(diǎn)干擾線不同,根據(jù)這一點(diǎn)可以直接把噪點(diǎn)全部去除,這里就不展開說了。
第一篇文章,先記錄如何將圖片進(jìn)行灰度處理、二值化、降噪,并結(jié)合tesserocr來識(shí)別簡(jiǎn)單的驗(yàn)證碼,剩下的部分在下一篇文章中和大家一起分享。

總結(jié)

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

相關(guān)文章

  • Tensorflow訓(xùn)練模型越來越慢的2種解決方案

    Tensorflow訓(xùn)練模型越來越慢的2種解決方案

    今天小編就為大家分享一篇Tensorflow訓(xùn)練模型越來越慢的2種解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Django 查詢數(shù)據(jù)庫(kù)返回JSON的實(shí)現(xiàn)

    Django 查詢數(shù)據(jù)庫(kù)返回JSON的實(shí)現(xiàn)

    和前端交互全部使用JSON,如何將數(shù)據(jù)庫(kù)查詢結(jié)果轉(zhuǎn)換成JSON格式,本文就來介紹一下,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Python?matplotlib實(shí)戰(zhàn)之散點(diǎn)圖繪制

    Python?matplotlib實(shí)戰(zhàn)之散點(diǎn)圖繪制

    散點(diǎn)圖,又名點(diǎn)圖、散布圖、X-Y圖,是將所有的數(shù)據(jù)以點(diǎn)的形式展現(xiàn)在平面直角坐標(biāo)系上的統(tǒng)計(jì)圖表,本文主要為大家介紹了如何使用Matplotlib繪制散點(diǎn)圖,需要的可以參考下
    2023-08-08
  • Python?使用pip在windows命令行中安裝HDF?reader包的操作方法

    Python?使用pip在windows命令行中安裝HDF?reader包的操作方法

    HDF reader包是一個(gè)常用來將.mat類型數(shù)據(jù)導(dǎo)入到python在這里插入代碼片中使用的包,非常好用,今天介紹一下,如何在命令行中安裝這個(gè)包,需要的朋友可以參考下
    2022-12-12
  • pytorch教程resnet.py的實(shí)現(xiàn)文件源碼分析

    pytorch教程resnet.py的實(shí)現(xiàn)文件源碼分析

    torchvision.models這個(gè)包中包含alexnet、densenet、inception、resnet、squeezenet、vgg等常用的網(wǎng)絡(luò)結(jié)構(gòu),并且提供了預(yù)訓(xùn)練模型,可以通過簡(jiǎn)單調(diào)用來讀取網(wǎng)絡(luò)結(jié)構(gòu)和預(yù)訓(xùn)練模型
    2021-09-09
  • Python實(shí)現(xiàn)OpenCV的安裝與使用示例

    Python實(shí)現(xiàn)OpenCV的安裝與使用示例

    這篇文章主要介紹了Python實(shí)現(xiàn)OpenCV的安裝與使用,結(jié)合實(shí)例形式分析了Python中OpenCV的安裝及針對(duì)圖片的相關(guān)操作技巧,需要的朋友可以參考下
    2018-03-03
  • 分享Pytorch獲取中間層輸出的3種方法

    分享Pytorch獲取中間層輸出的3種方法

    這篇文章主要給大家分享了Pytorch獲取中間層輸出的3種方法,文章內(nèi)容介紹詳細(xì),需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)或工作有所幫助
    2022-03-03
  • 關(guān)于Numpy中的行向量和列向量詳解

    關(guān)于Numpy中的行向量和列向量詳解

    今天小編就為大家分享一篇關(guān)于Numpy中的行向量和列向量詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 基于Python實(shí)現(xiàn)銀行卡識(shí)別的示例代碼

    基于Python實(shí)現(xiàn)銀行卡識(shí)別的示例代碼

    銀行卡識(shí)別是一個(gè)在金融、安全等領(lǐng)域具有重要應(yīng)用的問題,本文主要為大家介紹了如何使用Python和深度學(xué)習(xí)技術(shù)來實(shí)現(xiàn)銀行卡識(shí)別功能,需要的可以參考下
    2024-03-03
  • 深入理解Python對(duì)Json的解析

    深入理解Python對(duì)Json的解析

    Json是一種常用的數(shù)據(jù)交換結(jié)構(gòu),由于輕量、易于閱讀和編寫等特點(diǎn),在網(wǎng)絡(luò)方面應(yīng)用很廣。下面這篇文章主要介紹了Python對(duì)Json解析的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02

最新評(píng)論