Python 識別驗(yàn)證碼

前言

相信大家利用 Python 寫的爬蟲應(yīng)該遇到過要輸入驗(yàn)證碼的尷尬局面斩个,又或者寫了個自動填充表單的小程序胯杭,結(jié)果就卡在了驗(yàn)證碼上。由于我也遇上過上述兩種情況受啥,所以我在網(wǎng)上查閱資料后做个,打算將我查閱到的結(jié)果整理一下放在這里鸽心,順便做一個備份。

工具

  1. Python pytesseract 庫

pytesseract 是對 Tesseract-OCR 的一個封裝居暖,方便我們在 Python 中調(diào)用 Tesseract-OCR 引擎

Pypi Page

  1. Tesseract-OCR 開源識別引擎

Tesseract was originally developed at Hewlett-Packard Laboratories Bristol and at Hewlett-Packard Co, Greeley Colorado between 1985 and 1994, with some more changes made in 1996 to port to Windows, and some C++izing in 1998.

In 2005 Tesseract was open sourced by HP. Since 2006 it is developed by Google.

Github Page

  1. Python PIL(2.*)/Pillow(3.*) 庫

這兩個庫是 Python 關(guān)于圖像處理的第三方庫顽频,其中 3.* 的版本要用 Pillow 庫

安裝

  1. Tesseract-OCR

    • 源碼編譯:可參照官方Wiki
    • windows:安裝包可以在 Sourceforge 上下載,不過只有 3.02 版本的安裝包
    • Linux:以 Ubuntu 為例太闺,在終端輸入sudo apt-get tesseract-ocr即可進(jìn)行安裝
    • Mac:
      • MacPorts sudo port install tesseract
      • Homebrew brew install tesseract

    ** P.S.**

    在windows上安裝時糯景,在 Target appended to the Path 這一步耗時較久,請耐心等候省骂。

    安裝完成后莺奸,在命令行界面輸入 tesseract 會出現(xiàn)以下提示:

    Usage:tesseract imagename outputbase [-l lang] [-psm pagesegmode] [configfile...]
    
    pagesegmode values are:
    0 = Orientation and script detection (OSD) only.
    1 = Automatic page segmentation with OSD.
    2 = Automatic page segmentation, but no OSD, or OCR
    3 = Fully automatic page segmentation, but no OSD. (Default)
    4 = Assume a single column of text of variable sizes.
    5 = Assume a single uniform block of vertically aligned text.
    6 = Assume a single uniform block of text.
    7 = Treat the image as a single text line.
    8 = Treat the image as a single word.
    9 = Treat the image as a single word in a circle.
    10 = Treat the image as a single character.
    -l lang and/or -psm pagesegmode must occur before anyconfigfile.
    
    Single options:
      -v --version: version info
      --list-langs: list available languages for tesseract engine
    

則說明引擎安裝成功。

  1. virtualenv
    為了將 Python 主環(huán)境隔離開來冀宴,不影響第三方庫之間的兼容性灭贷,我們可以利用 virtualenv 來搭建虛擬且獨(dú)立的python環(huán)境,可以使每個項目環(huán)境與其他項目獨(dú)立開來略贮,保持環(huán)境的干凈甚疟,解決包沖突問題。

    可以通過 pip 和 easy_install 進(jìn)行安裝:

    easy_install virtualenv
    或
    pip install virtualenv
    

    詳細(xì)可參照使用virtualenv搭建獨(dú)立的Python環(huán)境

  2. PIL, Pillow, pytesseract
    這三個庫都可以通過 pip 直接安裝逃延。

編程

  1. 首先政冻,打開命令行或者終端万哪,輸入以下命令:
virtualenv venv --no-site-packages --python=X:\xxx\python.exe

各參數(shù)解釋:

  • venv 虛擬環(huán)境所在位置
  • --no-site-packages 不復(fù)制主環(huán)境的庫
  • --python 指定虛擬環(huán)境的 python 版本

然后在命令行輸入以下命令,激活虛擬環(huán)境

  • Linux
cd venv
source ./bin/activate
  • Windows
cd venv
.\Scripts\activate

如果要退出虛擬環(huán)境的話則輸入

deactivate
或
.\Scripts\deactivate
  1. 安裝依賴包
    在當(dāng)前虛擬環(huán)境中輸入
pip install PIL
pip install Pillow
pip install pytesseract

安裝完成后進(jìn)入python,import一下看是否安裝成功拉队。

  1. 圖片處理
  • step1. 打開圖片

    Captcha.jpg
    from PIL import Image
    im = Image.open('Captcha.jpg')
    
  • step2. 將彩色圖像轉(zhuǎn)化為灰度圖

    im = im.convert('L')
    

    轉(zhuǎn)化為灰度圖是為了減少圖片的色彩备闲,處理起來更方便

  • step3. 降噪蝇棉,圖片二值化

    為了消除背景對文字的影響喜最,可以通過設(shè)置一個閾值來將文字與背景分隔開來。而閾值可以參考圖片灰度的直方圖來得出料按,又或者試出來奄侠。

    這里將閾值設(shè)置為 140,然后將大于閾值的像素置 1载矿,小于閾值的置 0垄潮。

    def initTable(threshold=140):
     table = []
     for i in range(256):
         if i < threshold:
             table.append(0)
         else:
             table.append(1)
    
     return table
    

    再使用 im.point() 可以將灰度圖二值化,結(jié)果如下:

    binaryImage = im.point(initTable(), '1')
    binaryImage.show()
    
    Captcha1.jpg
  1. 識別文本

可以通過 pytesseract 的 image_to_string() 函數(shù)將圖片轉(zhuǎn)化為文本闷盔,該函數(shù)還可以接受參數(shù) config弯洗,config 設(shè)置的是 Tesseract-OCR 引擎的參數(shù),可自行查閱引擎的幫助文本逢勾。不過我們只需要用到 psm 參數(shù)牡整,具體的 psm 參數(shù)值如下:

-psm N
    Set Tesseract to only run a subset of layout analysis and assume a certain form of image. The options for N are:

    0 = Orientation and script detection (OSD) only.
    1 = Automatic page segmentation with OSD.
    2 = Automatic page segmentation, but no OSD, or OCR.
    3 = Fully automatic page segmentation, but no OSD. (Default)
    4 = Assume a single column of text of variable sizes.
    5 = Assume a single uniform block of vertically aligned text.
    6 = Assume a single uniform block of text.
    7 = Treat the image as a single text line.
    8 = Treat the image as a single word.
    9 = Treat the image as a single word in a circle.
    10 = Treat the image as a single character.

識別圖片的代碼如下:

print(image_to_string(binaryImage, config='-psm 7')

識別結(jié)果為

7226
  1. 誤差修正

經(jīng)過測試發(fā)現(xiàn),Tesseract-OCR 對于純數(shù)字的驗(yàn)證碼識別有一定誤差敏沉,因?yàn)樵撘孀R別的是英文文本果正,所以會將數(shù)字識別為字母。這時候就需要建立一個替換表盟迟,將識別錯誤的字母替換為數(shù)字秋泳,提高識別正確率。

參考鏈接

使用python以及工具包進(jìn)行簡單的驗(yàn)證碼識別

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末攒菠,一起剝皮案震驚了整個濱河市迫皱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辖众,老刑警劉巖卓起,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凹炸,居然都是意外死亡戏阅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門啤它,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奕筐,“玉大人,你說我怎么就攤上這事变骡±牒眨” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵塌碌,是天一觀的道長渊胸。 經(jīng)常有香客問我,道長台妆,這世上最難降的妖魔是什么翎猛? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮接剩,結(jié)果婚禮上办成,老公的妹妹穿的比我還像新娘。我一直安慰自己搂漠,他們只是感情好迂卢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著桐汤,像睡著了一般而克。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怔毛,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天员萍,我揣著相機(jī)與錄音,去河邊找鬼拣度。 笑死碎绎,一個胖子當(dāng)著我的面吹牛螃壤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播筋帖,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼奸晴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了日麸?” 一聲冷哼從身側(cè)響起寄啼,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎代箭,沒想到半個月后墩划,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嗡综,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年乙帮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片极景。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡蚣旱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出戴陡,到底是詐尸還是另有隱情塞绿,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布恤批,位于F島的核電站异吻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏喜庞。R本人自食惡果不足惜诀浪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望延都。 院中可真熱鬧雷猪,春花似錦、人聲如沸晰房。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽殊者。三九已至与境,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猖吴,已是汗流浹背摔刁。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留海蔽,地道東北人共屈。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓绑谣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拗引。 傳聞我的和親對象是個殘疾皇子借宵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容