摘要:驗證碼的識別成功率跟圖片質量關系密切,一般拿到后的驗證碼都得經過灰度化,二值化,去噪,利用就可以很方便的做到。
了解驗證碼 什么是驗證碼?
所謂驗證碼,就是將一串隨機產生的數字或符號,生成一幅圖片,圖片里加上一些干擾象素(防止OCR),由用戶肉眼識別其中的驗證碼信息,輸入表單提交網站驗證,驗證成功后才能使用某項功能,通俗說就是一種區分用戶是計算機和人的公共全自動程序驗證碼的作用
可以防止惡意破解密碼、刷票、論壇灌水,有效防止某個黑客對某一個特定注冊用戶用特定程序暴力破解方式進行不斷的登陸嘗試,所使用驗證碼技術是現在很多網站通行的方式(比如招商銀行的網上個人銀行,百度社區)。常見的驗證碼
沒有驗證碼登陸,黑客會更加容易破解你的賬號,通過組合碼刷機等黑客技術來破取你的密碼,有了驗證碼相當于加了一層很厚的屏障,安全系數很高。
如何識別驗證碼的內容?隨機的四位數字的組合,這是最原始的驗證碼
隨機數字圖片驗證碼,圖片上的字符比較中規中矩,驗證作用比上一個好
隨機數字+隨機大小寫英文字母圖片驗證碼,每刷新一次,每個字符還會變位置
隨機數字+隨機大小寫英文字母+隨機干擾像素+隨機位置圖片驗證碼,比上一個驗證作用更好,不易識別
所需要的工具:
Tesseract識別工具,目前由Google維護,支持中文,默認的識別率很低,特別是中文,但是可以自己提供樣本,訓練提高識別率。
安裝:
brew install tesseract --all-languages // MAC安裝 npm install node-tesseract // // windows安裝
在DOS窗口輸入:tesseract,顯示如圖則證明安裝成功
命令行使用方法:
tesseract imagename outputbase [-l lang] [-psm pagesegmode] [configfile…]
imagename為目標圖片文件名,需加格式后綴;outputbase是轉換結果文件名;lang是語言名稱(在Tesseract-OCR中tessdata文件夾可看到以eng開頭的語言文件eng.traineddata),如不標-l eng則默認為eng;pagesegmode則是生成結果顯示相關配置。
例如:
tesseract 1.jpg result -psm 7 tesseract code.jpg result -l chi_sim -psm 7 // -l chi_sim 表示用簡體中文字庫, -psm 7 表示告訴tesseract code.jpg圖片是一行文本,這個參數可以減少識別錯誤率,默認為3
node使用方法(官方示例):
var tesseract = require("node-tesseract"); // Recognize text of any language in any format tesseract.process(__dirname + "/path/to/image.jpg",function(err, text) { if(err) { console.error(err); } else { console.log(text); } }); // Recognize German text in a single uniform block of text and set the binary path var options = { l: "deu", psm: 6, binary: "/usr/local/bin/tesseract" }; tesseract.process(__dirname + "/path/to/image.jpg", options, function(err, text) { if(err) { console.error(err); } else { console.log(text); } });
運行結果:
嘗試調用此方法后會在本地文件生成一個對應的txt文件,內容即為識別內容??梢钥闯鰜?,對于簡單清楚的驗證碼識別還比較準確,但是對于帶有噪點或者其他影響的識別效果的就很坑,完全識別不出來,所以我們需要對圖片進行一些處理,比如提高圖片的閾值,比如設置為55%,可以用ps等軟件實現,但是node中已經有相應的包graphicsmagick,可以對圖像進行這種處理,比較方便。
graphicsmagick非常實用的圖像處理工具,一般后臺想要處理圖片就需要下載graphicsmagick,可以方便實現比如:制作縮略圖、頭像剪切等功能。
驗證碼的識別成功率跟圖片質量關系密切,一般拿到后的驗證碼都得經過灰度化,二值化,去噪,利用graphicsmagick就可以很方便的做到。
安裝:
brew install imagemagick brew install graphicsmagick // Mac安裝 npm install gm // windows安裝
命令行使用方法:
gm convert 1.jpg -thumbnail "100x100!" output_1.jpg // 非等比縮圖,生成的圖片大小是:100x100 gm convert 1.jpg 1.pdf // 格式轉換
node使用方法(官方示例):
var fs = require("fs") , gm = require("gm"); // resize and remove EXIF profile data gm("/path/to/my/img.jpg") .resize(240, 240) .noProfile() .write("/path/to/resize.png", function (err) { if (!err) console.log("done"); }); // some files would not be resized appropriately // http://stackoverflow.com/questions/5870466/imagemagick-incorrect-dimensions // you have two options: // use the "!" flag to ignore aspect ratio gm("/path/to/my/img.jpg") .resize(240, 240, "!") .write("/path/to/resize.png", function (err) { if (!err) console.log("done"); });
運行結果:
可以看出,gm成功將這個圖片進行裁剪或者轉換為pdf格式,使用很方便。
使用node識別驗證碼示例新建項目目錄
在合適的磁盤目錄下創建項目目錄 node-orc
初始化項目
1.進入node-orc文件夾下
2.執行npm init,初始化package.json文件
安裝依賴包
1.npm install gm
2.npm install node-tesseract
新建index.js,寫入代碼如下:
var fs = require("fs"); var tesseract = require("node-tesseract"); var gm = require("gm"); /** * 對圖片進行閾值處理(默認55) */ function disposeImg (imgPath, newPath, thresholdValue) { return new Promise((resolve, reject) => { gm(imgPath) .threshold(thresholdValue || 55) .write(newPath, (err)=> { if (err) return reject(err); resolve(newPath); }); }); } /** * 識別閾值化后圖片內容 */ function recognizeImg (imgPath, options) { options = Object.assign({psm: 8}, options); // options = Object.assign({l: "chi_sim"}, options); // 識別中文 return new Promise((resolve, reject) => { tesseract .process(imgPath, options, (err, text) => { if (err) return reject(err); resolve(text.replace(/[ s]/gm, "")); // 去掉識別結果中的換行回車空格 }); }); } async function recognize(imgPath, newPath, thresholdValue) { try { const newImgPath = await disposeImg(imgPath, newPath, thresholdValue) const result = await recognizeImg(newImgPath) console.log(`識別結果:${result}`) } catch (err) { console.error(`識別失敗:${err}`); } } recognize("1.jpg", "test_1.jpg")
運行代碼
進入當前目錄,運行node index即可直接打印出當前識別的結果
識別結果
可以看到比之前的識別率高很多,但是還是細節方便識別不夠好,不夠完善,感興趣的可以看看tesseract訓練,訓練一個自己的識別庫,精確度會提高很多
注意:
windows直接運行代碼會提示Could not execute GraphicsMagick/ImageMagick: gm "convert",這是因為Windows系統找不到gm中的convert命令,所以需要我們安裝個客戶端工具GraphicsMagick(下載的時候要下載Q8版本的),然后,因為convert這個命令執行需要特定的環境,所以我們需要在電腦的環境變量中加gm.exe的所在目錄
目前這個庫只能識別英文,中文直接是亂碼,如何識別中文呢?
我們可以下載一個中文庫,下載地址如下:https://pan.baidu.com/s/13DCN...,并下載Tesseract-OCR安裝包,tesseract安裝目錄的tessdata文件是存放語言庫的,可以將解壓后的文件放入這個文件夾下,字庫文件擴展名為.raineddata 簡體中文字庫文件名為 chi_sim.traineddata,使用的時候帶上語言類型即可,例如:tesseract 7.jpg result -l chi_sim
中文識別效果:
最后總結對于簡單的驗證碼直接用Tesseract識別
對于一些有噪點或者其他影響的驗證碼可以通過graphicsmagick進行圖像處理,再用Tesseract識別
關于中文或者其他語言的識別需要多帶帶下載相關的語言庫并放到tessData文件夾下,并在Tesseract識別代碼中配置一下
整個識別效果還是不夠完善,想要識別結果的準確度更高,可以對代碼進行Tesseract訓練,因為這個稍微復雜點,之后會繼續了解,希望大家多多交流指正!
相關代碼本文相關代碼和圖片github地址:https://github.com/fighting12...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107888.html
摘要:了別人代碼的你最近忽然對圖像識別有了興趣,作為一個前端,當然是想用來深入研究。先從簡單的入手,識別圖片驗證碼。圖片驗證碼對開發來說一點也不陌生,它是對服務器保護的一道屏障,避免了諸如暴力破解密碼之類的攻擊。 copy了別人代碼的你 showImg(https://segmentfault.com/img/bVN5FL?w=396&h=210); 最近忽然對圖像識別有了興趣,作為一個前...
摘要:我是一個知乎輕微重度用戶,之前寫了一只爬蟲幫我爬取并分析它的數據,我感覺這個過程還是挺有意思,因為這是一個不斷給自己創造問題又去解決問題的過程。所以這只爬蟲還有登陸知乎搜索題目的功能。 我一直覺得,爬蟲是許多web開發人員難以回避的點。我們也應該或多或少的去接觸這方面,因為可以從爬蟲中學習到web開發中應當掌握的一些基本知識。而且,它還很有趣。 我是一個知乎輕微重度用戶,之前寫了一只爬...
摘要:之前在學校曾經用過的方法做過一些爬蟲腳本來玩,從正式轉前端之后,出于興趣,我對爬蟲和反爬蟲又做了一些了解,并且做了一些爬蟲攻防的實踐。爬蟲腳本通常會很頻繁的進行網絡請求,比如要爬取豆瓣排行榜的電影,就會連續發送個網絡請求。 之前在學校曾經用過request+xpath的方法做過一些爬蟲腳本來玩,從ios正式轉前端之后,出于興趣,我對爬蟲和反爬蟲又做了一些了解,并且做了一些爬蟲攻防的實踐...
摘要:之前在學校曾經用過的方法做過一些爬蟲腳本來玩,從正式轉前端之后,出于興趣,我對爬蟲和反爬蟲又做了一些了解,并且做了一些爬蟲攻防的實踐。爬蟲腳本通常會很頻繁的進行網絡請求,比如要爬取豆瓣排行榜的電影,就會連續發送個網絡請求。 之前在學校曾經用過request+xpath的方法做過一些爬蟲腳本來玩,從ios正式轉前端之后,出于興趣,我對爬蟲和反爬蟲又做了一些了解,并且做了一些爬蟲攻防的實踐...
閱讀 3026·2021-11-24 09:39
閱讀 2255·2021-10-08 10:05
閱讀 2749·2021-09-24 13:52
閱讀 1569·2021-09-22 15:07
閱讀 589·2019-08-30 15:55
閱讀 1808·2019-08-30 15:53
閱讀 687·2019-08-30 15:44
閱讀 3116·2019-08-30 11:20