摘要:驗(yàn)證碼的識(shí)別成功率跟圖片質(zhì)量關(guān)系密切,一般拿到后的驗(yàn)證碼都得經(jīng)過灰度化,二值化,去噪,利用就可以很方便的做到。
了解驗(yàn)證碼 什么是驗(yàn)證碼?
所謂驗(yàn)證碼,就是將一串隨機(jī)產(chǎn)生的數(shù)字或符號(hào),生成一幅圖片,圖片里加上一些干擾象素(防止OCR),由用戶肉眼識(shí)別其中的驗(yàn)證碼信息,輸入表單提交網(wǎng)站驗(yàn)證,驗(yàn)證成功后才能使用某項(xiàng)功能,通俗說就是一種區(qū)分用戶是計(jì)算機(jī)和人的公共全自動(dòng)程序驗(yàn)證碼的作用
可以防止惡意破解密碼、刷票、論壇灌水,有效防止某個(gè)黑客對(duì)某一個(gè)特定注冊(cè)用戶用特定程序暴力破解方式進(jìn)行不斷的登陸嘗試,所使用驗(yàn)證碼技術(shù)是現(xiàn)在很多網(wǎng)站通行的方式(比如招商銀行的網(wǎng)上個(gè)人銀行,百度社區(qū))。常見的驗(yàn)證碼
沒有驗(yàn)證碼登陸,黑客會(huì)更加容易破解你的賬號(hào),通過組合碼刷機(jī)等黑客技術(shù)來破取你的密碼,有了驗(yàn)證碼相當(dāng)于加了一層很厚的屏障,安全系數(shù)很高。
如何識(shí)別驗(yàn)證碼的內(nèi)容?隨機(jī)的四位數(shù)字的組合,這是最原始的驗(yàn)證碼
隨機(jī)數(shù)字圖片驗(yàn)證碼,圖片上的字符比較中規(guī)中矩,驗(yàn)證作用比上一個(gè)好
隨機(jī)數(shù)字+隨機(jī)大小寫英文字母圖片驗(yàn)證碼,每刷新一次,每個(gè)字符還會(huì)變位置
隨機(jī)數(shù)字+隨機(jī)大小寫英文字母+隨機(jī)干擾像素+隨機(jī)位置圖片驗(yàn)證碼,比上一個(gè)驗(yàn)證作用更好,不易識(shí)別
所需要的工具:
Tesseract識(shí)別工具,目前由Google維護(hù),支持中文,默認(rèn)的識(shí)別率很低,特別是中文,但是可以自己提供樣本,訓(xùn)練提高識(shí)別率。
安裝:
brew install tesseract --all-languages // MAC安裝 npm install node-tesseract // // windows安裝
在DOS窗口輸入:tesseract,顯示如圖則證明安裝成功
命令行使用方法:
tesseract imagename outputbase [-l lang] [-psm pagesegmode] [configfile…]
imagename為目標(biāo)圖片文件名,需加格式后綴;outputbase是轉(zhuǎn)換結(jié)果文件名;lang是語言名稱(在Tesseract-OCR中tessdata文件夾可看到以eng開頭的語言文件eng.traineddata),如不標(biāo)-l eng則默認(rèn)為eng;pagesegmode則是生成結(jié)果顯示相關(guān)配置。
例如:
tesseract 1.jpg result -psm 7 tesseract code.jpg result -l chi_sim -psm 7 // -l chi_sim 表示用簡(jiǎn)體中文字庫, -psm 7 表示告訴tesseract code.jpg圖片是一行文本,這個(gè)參數(shù)可以減少識(shí)別錯(cuò)誤率,默認(rèn)為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); } });
運(yùn)行結(jié)果:
嘗試調(diào)用此方法后會(huì)在本地文件生成一個(gè)對(duì)應(yīng)的txt文件,內(nèi)容即為識(shí)別內(nèi)容??梢钥闯鰜?,對(duì)于簡(jiǎn)單清楚的驗(yàn)證碼識(shí)別還比較準(zhǔn)確,但是對(duì)于帶有噪點(diǎn)或者其他影響的識(shí)別效果的就很坑,完全識(shí)別不出來,所以我們需要對(duì)圖片進(jìn)行一些處理,比如提高圖片的閾值,比如設(shè)置為55%,可以用ps等軟件實(shí)現(xiàn),但是node中已經(jīng)有相應(yīng)的包graphicsmagick,可以對(duì)圖像進(jìn)行這種處理,比較方便。
graphicsmagick非常實(shí)用的圖像處理工具,一般后臺(tái)想要處理圖片就需要下載graphicsmagick,可以方便實(shí)現(xiàn)比如:制作縮略圖、頭像剪切等功能。
驗(yàn)證碼的識(shí)別成功率跟圖片質(zhì)量關(guān)系密切,一般拿到后的驗(yàn)證碼都得經(jīng)過灰度化,二值化,去噪,利用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 // 格式轉(zhuǎn)換
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"); });
運(yùn)行結(jié)果:
可以看出,gm成功將這個(gè)圖片進(jìn)行裁剪或者轉(zhuǎn)換為pdf格式,使用很方便。
使用node識(shí)別驗(yàn)證碼示例新建項(xiàng)目目錄
在合適的磁盤目錄下創(chuàng)建項(xiàng)目目錄 node-orc
初始化項(xiàng)目
1.進(jìn)入node-orc文件夾下
2.執(zhí)行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"); /** * 對(duì)圖片進(jìn)行閾值處理(默認(rèn)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); }); }); } /** * 識(shí)別閾值化后圖片內(nèi)容 */ function recognizeImg (imgPath, options) { options = Object.assign({psm: 8}, options); // options = Object.assign({l: "chi_sim"}, options); // 識(shí)別中文 return new Promise((resolve, reject) => { tesseract .process(imgPath, options, (err, text) => { if (err) return reject(err); resolve(text.replace(/[ s]/gm, "")); // 去掉識(shí)別結(jié)果中的換行回車空格 }); }); } async function recognize(imgPath, newPath, thresholdValue) { try { const newImgPath = await disposeImg(imgPath, newPath, thresholdValue) const result = await recognizeImg(newImgPath) console.log(`識(shí)別結(jié)果:${result}`) } catch (err) { console.error(`識(shí)別失敗:${err}`); } } recognize("1.jpg", "test_1.jpg")
運(yùn)行代碼
進(jìn)入當(dāng)前目錄,運(yùn)行node index即可直接打印出當(dāng)前識(shí)別的結(jié)果
識(shí)別結(jié)果
可以看到比之前的識(shí)別率高很多,但是還是細(xì)節(jié)方便識(shí)別不夠好,不夠完善,感興趣的可以看看tesseract訓(xùn)練,訓(xùn)練一個(gè)自己的識(shí)別庫,精確度會(huì)提高很多
注意:
windows直接運(yùn)行代碼會(huì)提示Could not execute GraphicsMagick/ImageMagick: gm "convert",這是因?yàn)閃indows系統(tǒng)找不到gm中的convert命令,所以需要我們安裝個(gè)客戶端工具GraphicsMagick(下載的時(shí)候要下載Q8版本的),然后,因?yàn)閏onvert這個(gè)命令執(zhí)行需要特定的環(huán)境,所以我們需要在電腦的環(huán)境變量中加gm.exe的所在目錄
目前這個(gè)庫只能識(shí)別英文,中文直接是亂碼,如何識(shí)別中文呢?
我們可以下載一個(gè)中文庫,下載地址如下:https://pan.baidu.com/s/13DCN...,并下載Tesseract-OCR安裝包,tesseract安裝目錄的tessdata文件是存放語言庫的,可以將解壓后的文件放入這個(gè)文件夾下,字庫文件擴(kuò)展名為.raineddata 簡(jiǎn)體中文字庫文件名為 chi_sim.traineddata,使用的時(shí)候帶上語言類型即可,例如:tesseract 7.jpg result -l chi_sim
中文識(shí)別效果:
最后總結(jié)對(duì)于簡(jiǎn)單的驗(yàn)證碼直接用Tesseract識(shí)別
對(duì)于一些有噪點(diǎn)或者其他影響的驗(yàn)證碼可以通過graphicsmagick進(jìn)行圖像處理,再用Tesseract識(shí)別
關(guān)于中文或者其他語言的識(shí)別需要多帶帶下載相關(guān)的語言庫并放到tessData文件夾下,并在Tesseract識(shí)別代碼中配置一下
整個(gè)識(shí)別效果還是不夠完善,想要識(shí)別結(jié)果的準(zhǔn)確度更高,可以對(duì)代碼進(jìn)行Tesseract訓(xùn)練,因?yàn)檫@個(gè)稍微復(fù)雜點(diǎn),之后會(huì)繼續(xù)了解,希望大家多多交流指正!
相關(guān)代碼本文相關(guān)代碼和圖片github地址:https://github.com/fighting12...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/107888.html
摘要:了別人代碼的你最近忽然對(duì)圖像識(shí)別有了興趣,作為一個(gè)前端,當(dāng)然是想用來深入研究。先從簡(jiǎn)單的入手,識(shí)別圖片驗(yàn)證碼。圖片驗(yàn)證碼對(duì)開發(fā)來說一點(diǎn)也不陌生,它是對(duì)服務(wù)器保護(hù)的一道屏障,避免了諸如暴力破解密碼之類的攻擊。 copy了別人代碼的你 showImg(https://segmentfault.com/img/bVN5FL?w=396&h=210); 最近忽然對(duì)圖像識(shí)別有了興趣,作為一個(gè)前...
摘要:識(shí)別網(wǎng)站驗(yàn)證碼詳見維基百科或者百度百科識(shí)別的驗(yàn)證碼原理采集一批驗(yàn)證碼,根據(jù)圖片特點(diǎn)進(jìn)行初步處理二值化灰度化濾波降噪等處理然后分割圖片,旋轉(zhuǎn)圖片,模板選取,訓(xùn)練算法,讓它更準(zhǔn)確。 最近在爬某網(wǎng)站,老是蹦出來驗(yàn)證碼,就想著找個(gè)OCR破了這個(gè)驗(yàn)證碼,然后就開始了OCR探索之旅。 首先簡(jiǎn)單說一下什么是OCR OCR是(Optical Character Recognition,光學(xué)字符識(shí)別)的...
摘要:我是一個(gè)知乎輕微重度用戶,之前寫了一只爬蟲幫我爬取并分析它的數(shù)據(jù),我感覺這個(gè)過程還是挺有意思,因?yàn)檫@是一個(gè)不斷給自己創(chuàng)造問題又去解決問題的過程。所以這只爬蟲還有登陸知乎搜索題目的功能。 我一直覺得,爬蟲是許多web開發(fā)人員難以回避的點(diǎn)。我們也應(yīng)該或多或少的去接觸這方面,因?yàn)榭梢詮呐老x中學(xué)習(xí)到web開發(fā)中應(yīng)當(dāng)掌握的一些基本知識(shí)。而且,它還很有趣。 我是一個(gè)知乎輕微重度用戶,之前寫了一只爬...
摘要:之前在學(xué)校曾經(jīng)用過的方法做過一些爬蟲腳本來玩,從正式轉(zhuǎn)前端之后,出于興趣,我對(duì)爬蟲和反爬蟲又做了一些了解,并且做了一些爬蟲攻防的實(shí)踐。爬蟲腳本通常會(huì)很頻繁的進(jìn)行網(wǎng)絡(luò)請(qǐng)求,比如要爬取豆瓣排行榜的電影,就會(huì)連續(xù)發(fā)送個(gè)網(wǎng)絡(luò)請(qǐng)求。 之前在學(xué)校曾經(jīng)用過request+xpath的方法做過一些爬蟲腳本來玩,從ios正式轉(zhuǎn)前端之后,出于興趣,我對(duì)爬蟲和反爬蟲又做了一些了解,并且做了一些爬蟲攻防的實(shí)踐...
摘要:之前在學(xué)校曾經(jīng)用過的方法做過一些爬蟲腳本來玩,從正式轉(zhuǎn)前端之后,出于興趣,我對(duì)爬蟲和反爬蟲又做了一些了解,并且做了一些爬蟲攻防的實(shí)踐。爬蟲腳本通常會(huì)很頻繁的進(jìn)行網(wǎng)絡(luò)請(qǐng)求,比如要爬取豆瓣排行榜的電影,就會(huì)連續(xù)發(fā)送個(gè)網(wǎng)絡(luò)請(qǐng)求。 之前在學(xué)校曾經(jīng)用過request+xpath的方法做過一些爬蟲腳本來玩,從ios正式轉(zhuǎn)前端之后,出于興趣,我對(duì)爬蟲和反爬蟲又做了一些了解,并且做了一些爬蟲攻防的實(shí)踐...
閱讀 3050·2021-11-24 09:39
閱讀 2305·2021-10-08 10:05
閱讀 2830·2021-09-24 13:52
閱讀 1608·2021-09-22 15:07
閱讀 622·2019-08-30 15:55
閱讀 1838·2019-08-30 15:53
閱讀 719·2019-08-30 15:44
閱讀 3154·2019-08-30 11:20