摘要:需要識(shí)別的驗(yàn)證碼圖像,其中包含個(gè)字符數(shù)字字母驗(yàn)證碼圖片來(lái)源思路灰度化將圖像轉(zhuǎn)為灰度圖像,即一個(gè)像素只有一種色階有種不同灰度,值為表示像素最黑,值為表示像素最白。
需要識(shí)別的驗(yàn)證碼圖像,其中包含 4 個(gè)字符(數(shù)字字母)
驗(yàn)證碼圖片來(lái)源:http://my.cnki.net/elibregist...
思路灰度化:將圖像轉(zhuǎn)為灰度圖像,即一個(gè)像素只有一種色階(有 256 種不同灰度),值為 0 表示像素最黑,值為 255 表示像素最白。
二值化:將圖像轉(zhuǎn)為黑白圖像,即一個(gè)像素只有黑白兩種狀態(tài),不是黑就是白,沒(méi)有灰色,值為 0 表示像素最黑,值為 1 表示像素最白.
圖像轉(zhuǎn)字符串:利用工具將圖像中的字符串識(shí)別出來(lái)
前面兩步都是對(duì)圖像進(jìn)行識(shí)別前處理,目的是提高計(jì)算機(jī)識(shí)別的準(zhǔn)確度,畢竟計(jì)算機(jī)本身不能理解圖像,一個(gè)像素值的微小變化都有可能導(dǎo)致錯(cuò)誤識(shí)別
代碼import tesserocr from PIL import Image image = Image.open("87FW.jpg") # 灰度化 image = image.convert("L") # 二值化,傳入的是數(shù)字 1,默認(rèn)閾值是 127。一般不推薦使用,因?yàn)椴粔蜢`活 # image = image.convert("1") # 另一種二值化。自定義灰度,將灰度值在 115 以上的設(shè)置 1(白色),其它設(shè)為 0(黑色),相當(dāng)于將閾值設(shè)置成了 115 table = [1] * 256 for i in range(256): table[i] = 0 if i > 115: break image = image.point(table, "1") print(tesserocr.image_to_text(image))
打印:
87FW
所謂的閾(yu)值是指將不同的像素值分開(kāi)的那個(gè)臨界值
上面的代碼沒(méi)有保存圖片,為了直觀得看到經(jīng)過(guò)不同的處理后圖像的區(qū)別,下面展示的是兩張圖像分別是灰度處理和二值化(閾值 115)后的圖像
下面將每種不同閾值的圖像保存至本地,主要代碼如下:
... image = Image.open("87FW.jpg") image = image.convert("L") table = [1] * 256 for i in range(256): table[i] = 0 image.point(table, "1").save(f"87FW_{i}.jpg")
閾值為 0 代表將所有像素處理成白色(沒(méi)有黑色);閾值為 255 代表將所有像素處理成黑色。
可以發(fā)現(xiàn)閾值設(shè)置得越低,白色越多,能看得到的驗(yàn)證碼(黑色)就少了,因?yàn)榇蟛糠只叶榷继幚沓砂咨环粗糸撝翟O(shè)置越大,黑色越多,更多的干擾像素處理成和驗(yàn)證碼一樣的黑色。
以下是將上面不同閾值的圖片制作成的一個(gè) gif 動(dòng)態(tài)圖像,可以看到如果閾值設(shè)定在 0 至 255 這個(gè)過(guò)程中,驗(yàn)證碼會(huì)呈現(xiàn)出不同效果
閾值是一個(gè)很難把控的關(guān)鍵,閾值設(shè)置大或小都會(huì)影響識(shí)別的準(zhǔn)確性,以下是遍歷所有閾值,測(cè)試閾值在哪個(gè)區(qū)間可以識(shí)別出正確的驗(yàn)證碼。注:由于沒(méi)有做優(yōu)化,整個(gè)過(guò)程會(huì)比較慢
>>> for i in range(256): ... if tesserocr.image_to_text(Image.open(f"87FW_{i}.jpg")).strip()=="87FW": ... print(i, end=" ") ... 109 110 112 113 114 115 116 117 118 119 120 122 123 124 169 170 171 172 173
在 256 個(gè)閾值中只有 19 個(gè)(不足 7.42%)閾值可以正確識(shí)別出驗(yàn)證碼,仔細(xì)察覺(jué)可以發(fā)現(xiàn)閾值區(qū)間被分成了多個(gè),分別是 109~110、112~120、122~124、169~173,說(shuō)明閾值區(qū)間不一定具有連續(xù)性。更糟糕的是,不同的驗(yàn)證碼圖片,能準(zhǔn)確識(shí)別出其中驗(yàn)證碼的閾值的數(shù)量、區(qū)間范圍、區(qū)間數(shù)等都很可能不同。當(dāng)然還有很多問(wèn)題,比如選擇一個(gè)“不恰當(dāng)”的閾值導(dǎo)致圖像處理過(guò)度,只識(shí)別出其中 3 個(gè)字符,不要試圖隨機(jī)添加一個(gè)字母或數(shù)字,因?yàn)樾枰紤]具體是哪個(gè)位置的字符沒(méi)識(shí)別出來(lái),這樣瞎猜幾乎是很難一次就命中的,好點(diǎn)的做法是:當(dāng)識(shí)別出來(lái)的字符不足時(shí)可以嘗試換一個(gè)閾值處理圖像,所以能識(shí)別出驗(yàn)證碼是概率事件。畢竟在正常的人機(jī)識(shí)別中,識(shí)別一個(gè)驗(yàn)證碼通常只有一次機(jī)會(huì),識(shí)別錯(cuò)了就會(huì)出現(xiàn)新的驗(yàn)證碼,沒(méi)有換閾值再重新試一次的機(jī)會(huì),不過(guò)好在通常閾值的范圍都是可以縮小的,比如可以忽略小于 70 和大于 200 的這些圖像處理過(guò)度的閾值(正常人都很難識(shí)別是什么數(shù)字、字母),這樣能命中的概率就會(huì)大大提高。
image.convert("1") 的默認(rèn)閾值是 127,在上面 19 個(gè)可以準(zhǔn)確識(shí)別驗(yàn)證碼的閾值中沒(méi)有 127,這也就是為什么直接使用 image.convert("1") 方法二值化的圖像無(wú)法被準(zhǔn)確識(shí)別出其中的驗(yàn)證碼
上面的驗(yàn)證碼還算容易處理的,如果干擾像素的灰度值與驗(yàn)證碼灰度差別比較大,可用上面的方法;但如果遇到干擾線條的灰度與驗(yàn)證碼差不多、驗(yàn)證碼重疊等情況,上面對(duì)圖像僅做簡(jiǎn)單處理的方法就很難奏效了。這時(shí)就需要用到機(jī)器學(xué)習(xí)技術(shù)對(duì)識(shí)別器進(jìn)行訓(xùn)練,聽(tīng)說(shuō)識(shí)別率幾乎 100%!
參考資料:《Python3網(wǎng)絡(luò)爬蟲(chóng)開(kāi)發(fā)實(shí)戰(zhàn)》——8.1 圖形驗(yàn)證碼的識(shí)別
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/42253.html
摘要:神經(jīng)網(wǎng)絡(luò)以上驗(yàn)證碼識(shí)別都依賴于字符切分,切分的好壞幾乎直接決定識(shí)別的準(zhǔn)確程度。目前驗(yàn)證碼識(shí)別最先進(jìn)的是谷歌在識(shí)別街景圖像中門牌號(hào)碼中使用的一套的算法。 最近在一個(gè)爬蟲(chóng)項(xiàng)目中遇到了驗(yàn)證碼,需要機(jī)器自動(dòng)識(shí)別繞過(guò)。剛好與題主的問(wèn)題類似,在這里做一些分享。 在網(wǎng)上調(diào)研了資料和文獻(xiàn)后,分別采用OCR識(shí)別和模板庫(kù)匹配方法對(duì)不同類型驗(yàn)證碼進(jìn)行了識(shí)別。主要過(guò)程可以分解為三個(gè)步驟:1.圖片清理,2.字符...
摘要:圖片驗(yàn)證碼是目前最常用的一種。神經(jīng)網(wǎng)絡(luò)以上驗(yàn)證碼識(shí)別都依賴于字符切分,切分的好壞幾乎直接決定識(shí)別的準(zhǔn)確程度。目前驗(yàn)證碼識(shí)別最先進(jìn)的是谷歌在識(shí)別街景圖像中門牌號(hào)碼中使用的一套的算法。 全自動(dòng)區(qū)分計(jì)算機(jī)和人類的圖靈測(cè)試(Completely Automated Public Turing test to tell Computers and Humans Apart,簡(jiǎn)稱CAPTCHA),...
摘要:在上一篇博客圖像處理之圖片文字識(shí)別中我們介紹了在中如何利用軟件來(lái)識(shí)別圖片中的英文與中文,本文將具體介紹如何在中利用軟件來(lái)識(shí)別驗(yàn)證碼數(shù)字加字母。 ??在上一篇博客Python圖像處理之圖片文字識(shí)別(OCR)中我們介紹了在Python中如何利用Tesseract軟件來(lái)識(shí)別圖片中的英文與中文,本文將具體介紹如何在Python中利用Tesseract軟件來(lái)識(shí)別驗(yàn)證碼(數(shù)字加字母)。??我們?cè)诰W(wǎng)...
摘要:了別人代碼的你最近忽然對(duì)圖像識(shí)別有了興趣,作為一個(gè)前端,當(dāng)然是想用來(lái)深入研究。先從簡(jiǎn)單的入手,識(shí)別圖片驗(yàn)證碼。圖片驗(yàn)證碼對(duì)開(kāi)發(fā)來(lái)說(shuō)一點(diǎn)也不陌生,它是對(duì)服務(wù)器保護(hù)的一道屏障,避免了諸如暴力破解密碼之類的攻擊。 copy了別人代碼的你 showImg(https://segmentfault.com/img/bVN5FL?w=396&h=210); 最近忽然對(duì)圖像識(shí)別有了興趣,作為一個(gè)前...
閱讀 3693·2021-11-25 09:43
閱讀 2653·2021-11-25 09:43
閱讀 3850·2021-11-24 09:38
閱讀 702·2021-11-18 10:02
閱讀 2242·2021-09-22 15:53
閱讀 3002·2019-08-30 15:44
閱讀 2778·2019-08-30 14:01
閱讀 2762·2019-08-29 15:15