基于KNN算法的數(shù)字驗(yàn)證碼識(shí)別的設(shè)計(jì)與實(shí)現(xiàn)_第1頁
基于KNN算法的數(shù)字驗(yàn)證碼識(shí)別的設(shè)計(jì)與實(shí)現(xiàn)_第2頁
基于KNN算法的數(shù)字驗(yàn)證碼識(shí)別的設(shè)計(jì)與實(shí)現(xiàn)_第3頁
基于KNN算法的數(shù)字驗(yàn)證碼識(shí)別的設(shè)計(jì)與實(shí)現(xiàn)_第4頁
基于KNN算法的數(shù)字驗(yàn)證碼識(shí)別的設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

數(shù)字驗(yàn)證碼識(shí)別的設(shè)計(jì)與實(shí)現(xiàn)[摘要]數(shù)字驗(yàn)證碼在安全方面起著十分大的用處,因此在很多網(wǎng)站都可以看到數(shù)字驗(yàn)證碼的使用。如今互聯(lián)網(wǎng)的發(fā)展相當(dāng)快速,緊隨著我們也就需要思考安全問題,隱私的泄露會(huì)或重或輕的影響用戶,而數(shù)字驗(yàn)證碼作為互聯(lián)網(wǎng)安全的常用的屏障,可以讓互聯(lián)網(wǎng)生態(tài)環(huán)境更加健康便利且很好的保護(hù)用戶隱私。目前,在網(wǎng)站上中相對(duì)常用的是由數(shù)字、字母組成的數(shù)字驗(yàn)證碼。本文針對(duì)粘連且存在干擾噪聲的數(shù)字驗(yàn)證碼圖像識(shí)別性能欠佳的情況,通過比較各種識(shí)別數(shù)字驗(yàn)證碼的方法,最終選擇使用KNN算法作為數(shù)字驗(yàn)證碼字符識(shí)別方法,本課題對(duì)有粘連扭曲情況的數(shù)字驗(yàn)證碼的識(shí)別進(jìn)行設(shè)計(jì)和分析,過程主要是以下三步:預(yù)處理、匹配識(shí)別、分析識(shí)別率。圖片預(yù)處理過程采用了灰度化、二值化、降噪和分割,在分割圖片階段,可能出現(xiàn)檢測(cè)出四、三、二和一個(gè)字符的情況,分別采用不同的方法進(jìn)行處理,再采用Python工具進(jìn)行單字符匹配,最后通過KNN算法來識(shí)別匹配數(shù)字驗(yàn)證碼,得到了高達(dá)94.4%的識(shí)別率,這說明采用該算法能很好的識(shí)別粘連扭曲的數(shù)字驗(yàn)證碼圖片。[關(guān)鍵詞]驗(yàn)證碼識(shí)別;KNN算法;驗(yàn)證碼匹配;PythonDesignandImplementationofDigitalAuthenticationCodeRecognitionStudent:LiXinyu,CollegeofElectronicInformationInstructor:WangYuanmei,CollegeofElectronicInformation[Abstract]DigitalAuthenticationCode(DAC)playsaveryimportantroleinsecurity,soitcanbeusedinmanywebsites.WiththerapiddevelopmentoftheInternet,wealsoneedtothinkaboutsecurityissues.Theleakofprivacywillaffectusersmoreorless.DigitalAuthenticationCode,asacommonbarriertoInternetsecurity,canmaketheInternetecologicalenvironmenthealthier,moreconvenientandbetterprotectuserprivacy.Atpresent,therelativelycommondigitalverificationcodeonwebsitesiscomposedofnumbersandletters.Inviewofthepoorperformanceofimagerecognitionofdigitalverificationcodeswithglueandinterferencenoise,thispaperchoosesKNNalgorithmasthecharacterrecognitionmethodofdigitalverificationcodesbycomparingvariousmethodsofidentifyingdigitalverificationcodes.Thistopicdesignsandanalyzestherecognitionofdigitalverificationcodeswithgluedistortion.Theprocessmainlyconsistsofthreesteps:preprocessing,Matchrecognition,analyzerecognitionrate.Picturepreprocessingprocessusesgrayscale,binarization,noisereductionandsegmentation.Inthephaseofimagesegmentation,four,three,twoandonecharactersmaybedetected.Differentmethodsareusedtoprocessthem,thensinglecharactermatchingisperformedwithPythontools.Finally,matchingnumberverificationcodesarerecognizedbyKNNalgorithm,andtherecognitionrateisupto94.4%.Thisdemonstratesthatthealgorithmcanrecognizethedistorteddigitalauthenticationcodepictureverywell.[Keywords]Verificationcodeidentification;KNNrecognition;VerificationCodeMatching;Python第一章緒論1.1研究目的及意義當(dāng)前,隨著互聯(lián)網(wǎng)技術(shù)的不斷創(chuàng)新研發(fā),我國(guó)科技技術(shù)飛速發(fā)展,各類新興產(chǎn)品應(yīng)運(yùn)而生,在不斷豐富人們生活的同時(shí),提高了人們生活質(zhì)量與生活水平。當(dāng)前,隨著網(wǎng)絡(luò)技術(shù)不斷的應(yīng)用與普及,各類識(shí)別技術(shù)運(yùn)用其中,極大的提高了網(wǎng)絡(luò)使用的安全性與便捷性,當(dāng)前識(shí)別技術(shù)應(yīng)用較為廣泛,如語音識(shí)別,圖像識(shí)別,射頻識(shí)別,數(shù)字驗(yàn)證碼識(shí)別等,對(duì)我國(guó)軍事,刑偵,醫(yī)學(xué)等各領(lǐng)域產(chǎn)生了積極的貢獻(xiàn)與作用。在本文中,主要對(duì)數(shù)字驗(yàn)證碼識(shí)別技術(shù)進(jìn)行研究,其作為識(shí)別技術(shù)中的一種,在當(dāng)前電子設(shè)備廣泛應(yīng)用的背景下,能夠有效完成多類復(fù)雜運(yùn)算,具有較高的準(zhǔn)確性與高效性。在當(dāng)前互聯(lián)網(wǎng)時(shí)代背景下,大數(shù)據(jù)發(fā)展日益加快,需求增多,因此,為有效提高數(shù)據(jù)的準(zhǔn)確性與安全性,保障用戶權(quán)益,識(shí)別數(shù)字驗(yàn)證碼技術(shù)在其中扮演著重要角色。同時(shí),與語言文字等相比,我們?cè)诂F(xiàn)實(shí)生活中對(duì)數(shù)字的精準(zhǔn)度有著更高要求,究其原因,主要在于一旦其中任意數(shù)字出現(xiàn)錯(cuò)誤,便很可能造成重大失誤,如金融,快遞,財(cái)務(wù)等對(duì)數(shù)據(jù)的準(zhǔn)確性有著較高要求??偠灾?,為有效提高數(shù)據(jù)的精準(zhǔn)性與安全性,數(shù)字驗(yàn)證碼識(shí)別技術(shù)研究意義重大。而隨著互聯(lián)網(wǎng)的不斷發(fā)展,自動(dòng)化程序日益增多,對(duì)互聯(lián)網(wǎng)的安全性所造成威脅逐漸增加,一旦網(wǎng)站被自動(dòng)化程序所破解,很容易造成網(wǎng)站用戶信息泄露,資源非法使用等各類問題,嚴(yán)重時(shí)甚至造成系統(tǒng)崩潰,對(duì)網(wǎng)站的推廣與應(yīng)用帶來一系列不利影響。為有效避免或減少該類問題的發(fā)生,通過數(shù)字驗(yàn)證碼技術(shù),實(shí)現(xiàn)對(duì)系統(tǒng)網(wǎng)站使用用戶合法性的驗(yàn)證,進(jìn)而提高系統(tǒng)網(wǎng)站的安全性。一般而言,數(shù)字驗(yàn)證碼技術(shù)較多應(yīng)用于系統(tǒng)網(wǎng)站的注冊(cè),登錄,以及發(fā)帖頁面,避免出現(xiàn)自動(dòng)化程序非法注冊(cè),登錄以及使用該系統(tǒng)資源,對(duì)網(wǎng)站進(jìn)行攻擊,有效提高了系統(tǒng)的安全性以及抗攻擊力。驗(yàn)證碼,即CAPTCHA,其相關(guān)概念于2000年被首次公示,其本質(zhì)上作為一種全自動(dòng)圖靈測(cè)試的程序,主要用于對(duì)人類使用系統(tǒng)以及計(jì)算機(jī)自動(dòng)化程序使用系統(tǒng)的識(shí)別。驗(yàn)證碼在系統(tǒng)使用中,主要由計(jì)算機(jī)程序自動(dòng)產(chǎn)生,進(jìn)而由人類用戶對(duì)驗(yàn)證碼進(jìn)行手動(dòng)輸入或語音輸入,根據(jù)驗(yàn)證碼輸入的準(zhǔn)確性,進(jìn)而對(duì)系統(tǒng)用戶進(jìn)行合法性判斷,究其原因,主要在于驗(yàn)證碼的輸入大多數(shù)人類能夠準(zhǔn)確進(jìn)行,而自動(dòng)化程序大多數(shù)不具有輸入驗(yàn)證碼的功能,因此,能夠有效實(shí)現(xiàn)對(duì)系統(tǒng)用戶合法性的判定。同時(shí),通過對(duì)驗(yàn)證碼識(shí)別技術(shù)的運(yùn)用,能夠有效避免網(wǎng)站系統(tǒng)被暴力性攻擊,提高系統(tǒng)安全性,避免系統(tǒng)用戶相關(guān)信息泄漏,對(duì)用戶的安全性造成一定威脅。另外,驗(yàn)證碼識(shí)別技術(shù)還可以防止網(wǎng)站出現(xiàn)惡意刷票,論壇灌水等問題,在現(xiàn)實(shí)生活中被廣泛運(yùn)用。1.2研究歷史及發(fā)展現(xiàn)狀在國(guó)外,數(shù)字驗(yàn)證碼的識(shí)別研究較早,是一個(gè)熱門的研究領(lǐng)域。1990年YannLecun等人使用反向傳播神經(jīng)網(wǎng)絡(luò)(BP_NN)設(shè)計(jì)了一種識(shí)別手寫數(shù)字的方法,其誤識(shí)率1%,拒識(shí)率為9%,識(shí)別率達(dá)90%。REF_Ref72078900\r\h[1]20世紀(jì)90年代末期,以M.A.Hearst為代表的學(xué)者研究出支持向量機(jī)算法,這是種基于統(tǒng)計(jì)學(xué)的回歸算法以及分類算法,該類識(shí)別技術(shù)在運(yùn)用中具有較好的識(shí)別效果,為識(shí)別技術(shù)的推廣與應(yīng)用打下良好的基礎(chǔ)。21世紀(jì)初期,以A.Bellili為代表的學(xué)者研究出MLP-SVM算法,該類算法能夠有效達(dá)到對(duì)數(shù)字的無約束識(shí)別效果,識(shí)別效果顯著,可高達(dá)98%左右,應(yīng)用較為廣泛。同一年,Cheng-LinLiu等人通過研究,實(shí)現(xiàn)了對(duì)圖像數(shù)據(jù)的采集與識(shí)別,主要借助圖像的特征以及特征分類等技術(shù),分類器則采用了K最近鄰算法(K-NearestNeighbor,KNN)以及支持向量機(jī)等算法,有效提高了圖像數(shù)據(jù)識(shí)別的準(zhǔn)確性有高效性。以Cire?anDC為代表的學(xué)者提出借助反向傳播,能夠有效實(shí)現(xiàn)對(duì)普通多層感知器識(shí)別效果的提高,識(shí)別效果十分顯著,可達(dá)到99%的識(shí)別效果,有效促進(jìn)了識(shí)別技術(shù)的發(fā)展與推廣。以MORI為代表的學(xué)者主要借助形狀上下文的研究辦法,實(shí)現(xiàn)了對(duì)兩種驗(yàn)證碼的研究,一種是GIMPY驗(yàn)證碼,另外一種是EZ—GIMPY驗(yàn)證碼。相比于國(guó)外對(duì)數(shù)字驗(yàn)證碼識(shí)別技術(shù)的研究,我國(guó)研究起步較晚,相關(guān)理論與技術(shù)不夠成熟與完善,但隨著我國(guó)科技技術(shù)的發(fā)展,以及對(duì)數(shù)字識(shí)別技術(shù)的逐漸重視,研究逐漸加快。以胡君萍為代表的學(xué)者研究出KNN數(shù)字識(shí)別器,借助主成分分析法實(shí)現(xiàn)了對(duì)數(shù)字維度的有效減少,進(jìn)一步提高了數(shù)字識(shí)別的效率。張海生基于神經(jīng)網(wǎng)絡(luò)對(duì)數(shù)字驗(yàn)證碼進(jìn)行識(shí)別研究。借助深度置信網(wǎng)絡(luò),我國(guó)以宋曉茹為代表的學(xué)者,實(shí)現(xiàn)了對(duì)數(shù)字識(shí)別算法的研究。我國(guó)以閔鋒為代表的學(xué)者,對(duì)數(shù)字驗(yàn)證碼識(shí)別技術(shù)的研究,主要分為以下三步:第一,借助主成分分析法實(shí)現(xiàn)對(duì)數(shù)字維度的降低;第二,實(shí)施投影;第三借助svm算法實(shí)現(xiàn)對(duì)數(shù)據(jù)的分類,通過研究發(fā)現(xiàn)該類數(shù)字驗(yàn)證碼識(shí)別技術(shù)有較好的識(shí)別效果以及識(shí)別效率,得到廣泛的應(yīng)用與推廣。以曾文獻(xiàn)為代表的學(xué)者以MNIST數(shù)據(jù)為被識(shí)別對(duì)象,借助卷積神經(jīng)網(wǎng)絡(luò)以及自編碼器實(shí)現(xiàn)對(duì)數(shù)據(jù)的識(shí)別,識(shí)別效果顯著,高達(dá)99%,為我國(guó)數(shù)字驗(yàn)證碼識(shí)別技術(shù)的發(fā)展與應(yīng)用打下堅(jiān)實(shí)基礎(chǔ)。]徐文進(jìn)等人基于KNN算法的改進(jìn)K-means算法進(jìn)行數(shù)字識(shí)別。[15]1.3課題研究?jī)?nèi)容本課題分析比較了以上幾種識(shí)別方法,最終選取KNN算法作為數(shù)字驗(yàn)證碼識(shí)別研究的方法。KNN算法本質(zhì)上作為一種人工智能算法,主要通過對(duì)數(shù)字特征的統(tǒng)計(jì),并在此基礎(chǔ)上,進(jìn)行數(shù)字分類的一種算法,該算法操作簡(jiǎn)單,便捷,適用性強(qiáng),應(yīng)用較為廣泛。在本文中借助KNN算法實(shí)現(xiàn)對(duì)數(shù)字驗(yàn)證碼技術(shù)的研究,其中對(duì)于編程語言的選擇主要是Python,對(duì)于Python而言,其在運(yùn)行過程中主要借助編譯器實(shí)現(xiàn),能夠高速完成人工智能算法以及機(jī)器學(xué)習(xí),滿足本文中對(duì)自動(dòng)化程序以及人工操作系統(tǒng)的識(shí)別。在本文中,對(duì)數(shù)字驗(yàn)證碼圖像的研究,主要用于解決圖像中字符粘連扭曲以及噪聲較多的問題,有效提高對(duì)圖像數(shù)字驗(yàn)證碼識(shí)別效果。通過Python進(jìn)行圖片預(yù)處理和分割粘連字符后,基于KNN算法識(shí)別驗(yàn)證碼圖像中包含有多個(gè)字母,字符以及數(shù)字之間相互粘連的驗(yàn)證碼,并對(duì)其開展測(cè)試識(shí)別以及網(wǎng)絡(luò)訓(xùn)練,進(jìn)而分析出識(shí)別率并用Python界面展示出識(shí)別結(jié)果。本文的主要框架結(jié)果梳理如下:第一章作為本課題的前言介紹了數(shù)字驗(yàn)證碼識(shí)別的研究目的和意義、數(shù)字驗(yàn)證碼的研究歷史及發(fā)展現(xiàn)狀。第二章介紹了本課題涉及的相關(guān)圖像處理技術(shù),分析比較了幾種識(shí)別方法并進(jìn)行方案選擇,并闡明所采用的方案的特點(diǎn)。第三章介紹了數(shù)字驗(yàn)證碼識(shí)別的設(shè)計(jì)實(shí)現(xiàn)過程,包括各功能模塊的詳細(xì)設(shè)計(jì)原理及相關(guān)程序的詳細(xì)說明。第四章是對(duì)數(shù)字驗(yàn)證碼識(shí)別的設(shè)計(jì)過程的結(jié)果分析。第五章是對(duì)數(shù)字驗(yàn)證碼識(shí)別的研究工作進(jìn)行歸納和總結(jié)。第二章數(shù)字驗(yàn)證碼識(shí)別的相關(guān)技術(shù)對(duì)于數(shù)字驗(yàn)證碼而言,其對(duì)圖像的識(shí)別主要包括三大步驟:第一是對(duì)圖像的預(yù)處理操作,實(shí)現(xiàn)對(duì)圖像的灰度化、降噪、二值化等;第二是對(duì)數(shù)字驗(yàn)證碼的分割,該環(huán)節(jié)在整個(gè)數(shù)字驗(yàn)證碼識(shí)別過程中扮演著重要角色,決定著識(shí)別效果的高低,究其原因主要在于數(shù)字驗(yàn)證碼的不同性特征,即不同的數(shù)字驗(yàn)證碼,其粘連性,扭曲性程度有所不同,因此需對(duì)其進(jìn)行不同分割,在一定程度上造成對(duì)數(shù)字驗(yàn)證碼分割效果的不同;第三,是對(duì)數(shù)字驗(yàn)證碼的識(shí)別。目前對(duì)驗(yàn)證碼圖像的識(shí)別方法主要有三種:模板匹配分類算法、形狀上下文分類算法、人工智能領(lǐng)域的分類算法(KNN算法、神經(jīng)網(wǎng)絡(luò)算法)。2.1圖片預(yù)處理圖片預(yù)處理作為數(shù)字驗(yàn)證碼識(shí)別的首要步驟,首先對(duì)圖像格式進(jìn)行檢測(cè),通過對(duì)圖像格式的判定,進(jìn)而將其轉(zhuǎn)換成可識(shí)別格式,并進(jìn)一步對(duì)圖像進(jìn)行灰度化,降噪,以及二值化等處理。當(dāng)前,在許多系統(tǒng)網(wǎng)站中,對(duì)于數(shù)字驗(yàn)證碼的運(yùn)用較多為彩色,因此為有效提高對(duì)數(shù)字驗(yàn)證碼的識(shí)別效果,提高識(shí)別效率,一般將彩色的數(shù)字驗(yàn)證碼轉(zhuǎn)變?yōu)楹诎咨臄?shù)字驗(yàn)證碼,大大減少了復(fù)雜程度,便于后續(xù)操作。因此,在該圖片預(yù)處理階段的目標(biāo)是除去不必要信息,包括圖像的背景,像素,噪聲等信息,減少數(shù)字驗(yàn)證碼識(shí)別的程序與復(fù)雜性,實(shí)現(xiàn)對(duì)圖像的二進(jìn)制點(diǎn)陣轉(zhuǎn)換,便于下一步操作。2.1.1灰度化彩色圖像,顧名思義,又可稱其為三通道圖像,主要由R、G、B共同組成圖像的像素。因此在對(duì)彩色圖像進(jìn)行灰度化處理時(shí),需分別處理R,G,B三通道,在該處理模式下,會(huì)耗費(fèi)很多時(shí)間消耗多余的資源。鑒于此,為有效提高對(duì)彩色圖像的灰度化處理效果,提高對(duì)數(shù)字驗(yàn)證碼識(shí)別的效率,減少處理數(shù)據(jù),對(duì)彩色圖像的灰度化處理需將三通道的彩色圖像進(jìn)行轉(zhuǎn)換,將其轉(zhuǎn)換為單通道的灰度圖像。對(duì)于RGB模型而言,如果R、G、B三通道具有相同的值,即呈現(xiàn)為灰度,灰度值即代表著三通道的值。對(duì)于灰度圖像而言,每個(gè)像素處于0或255的灰度范圍內(nèi),當(dāng)三個(gè)通道值不相同時(shí),主要采用以下彩色圖像灰度處理法。1.單分量法在不同的圖像中,三個(gè)通道的值分別代表著相應(yīng)的灰度值。因此,在對(duì)彩色圖像進(jìn)行灰度化處理時(shí),以三個(gè)通道中任一通道值作為處理對(duì)象,具體公式如下所示:f(x,y)=R(x,y)f(x,y)=G(x,y)(1)f(x,y)=B(x,y)其中f(x,y)為灰度化后的灰度圖像在位置(x,y)的像素值,R(x,y),G(x,y),B(x,y)代表著R、G、B三通道的各個(gè)值。2.最大化處理法:首先對(duì)R,G,B三通道的最大值進(jìn)行計(jì)算,即代表著圖像灰度化后的最大值,具體公式如下所示:f(x,y)=max((R(x,y),G(x,y),B(x,y))(2)3.求取平均值法:對(duì)R、G、B三通道的值分別進(jìn)行計(jì)算,在計(jì)算結(jié)果得出后,求取平均值,即代表著彩色圖像的灰度值,具體公式如下所示:f(x,y)=(R(x,y)+G(x,y)+B(x,y))/3(3)4.加權(quán)平均法在對(duì)彩色圖像灰度化處理中,單分量法,最大化法以及平均值法的具體運(yùn)用較為簡(jiǎn)單,對(duì)三通道的處理具有統(tǒng)一性,操作較為簡(jiǎn)單,便捷。但不同的圖像,其特征也有所不同,分量比重也有所區(qū)別,因此根據(jù)三通道分量比重,需對(duì)其進(jìn)行相應(yīng)的權(quán)值分配,并對(duì)其進(jìn)行加權(quán)計(jì)算,并進(jìn)一步獲取均值,即灰度值。即按照下列公式對(duì)要處理的圖像進(jìn)行灰度化:f(x,y)=0.30R(x,y)+0.59G(x,y)+0.11B(x,y)(4)在對(duì)彩色圖像灰度化處理法中,加權(quán)平均法在四類彩色圖像灰度處理法中應(yīng)用最為廣泛,所得結(jié)果更準(zhǔn)確。所以進(jìn)行圖像灰度化時(shí)本課題采用了OpenCV中的BGR2GRAY方法,因?yàn)樗霓D(zhuǎn)換原理與加權(quán)平均法的公式相似,即GRAY=B*0.114+G*0.587+R*0.299(5)2.1.2二值化在圖像的預(yù)處理中,二值化代表著對(duì)圖像灰度值數(shù)據(jù)的處理,將其轉(zhuǎn)換為灰度值0~255的范圍內(nèi),圖片由彩色轉(zhuǎn)換為黑白,便于圖像的下一步處理與識(shí)別。通過圖像二值化處理,實(shí)現(xiàn)對(duì)圖像局部特征以及整體特征的有效顯現(xiàn)。在對(duì)圖像進(jìn)行預(yù)處理的整個(gè)流程中,二值化在其中扮演著重要角色,實(shí)現(xiàn)對(duì)圖像的有效處理,將獲取相應(yīng)的二值化圖像,為下一步圖像處理打下堅(jiān)實(shí)基礎(chǔ)。通過圖像的二值化處理,實(shí)現(xiàn)圖像像素灰度值的轉(zhuǎn)換,即圖像的灰度值始終處于0或255的范圍內(nèi),與像素的其他等級(jí)的值無關(guān),這樣會(huì)使過程更加容易,且減小了信息的處理流程與復(fù)雜性。同時(shí)對(duì)于圖像二值化處理,為保證其二值化處理效果,需保證圖像的邊緣處于封閉以及連通狀態(tài)。當(dāng)圖像灰度值大于閥值時(shí),以255進(jìn)行代表,且該類像素歸為特定物體,當(dāng)圖像灰度值未在物體區(qū)域內(nèi)時(shí),其灰度值以零進(jìn)行代表。閾值主要分為以下兩類:1.對(duì)于全局閥值而言,其主要代表在被預(yù)處理圖像中,該圖像包含有多類信息,包括背景,噪聲以及目標(biāo)物體等,在圖像中需對(duì)目標(biāo)物體進(jìn)行提取,在現(xiàn)實(shí)生活中,使用較多的方法為閥值的確定,將該閥值設(shè)為T,進(jìn)而利用該閥值實(shí)現(xiàn)對(duì)圖像數(shù)據(jù)的分類,產(chǎn)生兩大像素群:一類<T,另一類>T。該方法在對(duì)圖像灰度處理中,應(yīng)用較為廣泛,即為圖像二值化處理。2.對(duì)于局部閥值而言,其主要代表著在被預(yù)處理圖像中,各個(gè)區(qū)域的亮度有所不同。因此對(duì)于圖像的預(yù)處理,需根據(jù)各個(gè)區(qū)域進(jìn)行不同閥值的設(shè)定,進(jìn)而提高圖像預(yù)處理的效果。在本文中,主要運(yùn)用全局閾值,即二值化處理,因其用于數(shù)字驗(yàn)證碼圖片二值化時(shí)會(huì)更加有鮮明的對(duì)比且直觀。Python-OpenCV中提供閾值(threshold)函數(shù):threshold(src,thresh,maxval,type,dst=None)(6)

Method閾值類型一般分為五種:

cv2.THRESH_BINARY——大于閾值的部分像素值變?yōu)樽畲笾?,其他變?yōu)?

cv2.THRESH_BINARY_INV——大于閾值的部分變?yōu)?,其他部分變?yōu)樽畲笾?/p>

cv2.THRESH_TRUNC——大于閾值的部分變?yōu)殚撝?,其余部分不?/p>

cv2.THRESH_TOZERO——大于閾值的部分不變,其余部分變?yōu)?

cv2.THRESH_TOZERO_INV——大于閾值的部分變?yōu)?,其余部分不變這里本課題采用OpenCV中的cv2.THRESH_BINARY_INV方法,即自定義閾值為N,像素值大于N的部分是黑色,小于N的部分是白色。使二值化后的數(shù)字驗(yàn)證碼圖片中的字符更加直觀。2.1.3降噪在對(duì)圖像進(jìn)行二值化處理后,會(huì)使圖像產(chǎn)生一定的噪聲以及圖像像素中含有相應(yīng)的分割字符,在一定程度上會(huì)造成后期對(duì)數(shù)字驗(yàn)證碼的識(shí)別效果。因此為有效提高后期對(duì)數(shù)字驗(yàn)證碼的分割效果,需對(duì)圖像進(jìn)行相應(yīng)的降噪處理,減少因圖像傳輸或量化等處理過程中所產(chǎn)生的噪音。一般而言,噪聲主要包括4類:第一類是乘性噪聲,第二類是高斯噪聲,第三類是泊松噪聲,第四類是椒鹽噪聲。因?yàn)槎祷蟮膱D像為二維元組,所以可應(yīng)用OpenCV中的cv2.filter2D進(jìn)行濾波處理,即利用內(nèi)核實(shí)現(xiàn)對(duì)圖像的卷積運(yùn)算。而高斯模糊本質(zhì)上是低通濾波器,實(shí)現(xiàn)對(duì)低頻的有效通行,限制或減弱高頻,對(duì)于輸出圖像而言,其像素點(diǎn)代表著其對(duì)應(yīng)像素點(diǎn)以及周圍像素點(diǎn)的加權(quán)和,原理并不復(fù)雜,就是用高斯分布權(quán)值矩陣與原始圖像矩陣做卷積運(yùn)算。所以本課題采用高斯模糊對(duì)圖片進(jìn)行降噪。高斯模糊的本質(zhì)是用高斯核和圖像做卷積,就是去除一些斑斑點(diǎn)點(diǎn)的。因?yàn)槎祷y免不夠完美,去噪能使得二值化結(jié)果更好。2.1.4圖片分割圖像分割是數(shù)字驗(yàn)證碼識(shí)別過程中很重要的一步,因?yàn)楸菊n題是在Python軟件上設(shè)計(jì)實(shí)現(xiàn)的,所以這里用到的技術(shù)是opencv,opencv中可以基于閾值進(jìn)行圖像分割也可以基于邊緣進(jìn)行圖像分割?;陂撝档膱D像分割基于閾值實(shí)現(xiàn)對(duì)圖像分割的預(yù)處理,該方法的運(yùn)用主要借助圖像像素特征,實(shí)現(xiàn)對(duì)分割閥值的確定,并通過閥值以及特征值兩者之間的對(duì)比,實(shí)現(xiàn)對(duì)圖像像素的分類。一般而言,對(duì)于閥值的確定,主要以像素灰度值作為判斷依據(jù)。根據(jù)灰度級(jí)實(shí)現(xiàn)對(duì)像素集合的劃分,進(jìn)而獲取相應(yīng)的子集合,并在該子集合中,與圖像各個(gè)區(qū)域相對(duì)應(yīng),在同一子集合中,各區(qū)域具有一定的一致性,進(jìn)而實(shí)現(xiàn)圖像的分割。該種圖像分割法,運(yùn)用較為廣泛,其分割效率高,效果好,具有較穩(wěn)性能,在圖像預(yù)處理中扮演著重要角色。同時(shí),該種圖像分割法能夠有效應(yīng)用于不同灰度級(jí)別的圖像,即圖像中目標(biāo)與背景處于不同區(qū)域,能夠有效實(shí)現(xiàn)對(duì)目標(biāo)物的提取,操作簡(jiǎn)單便捷,流程簡(jiǎn)化,是圖像預(yù)處理中分析圖像,獲取特征以及識(shí)別的重要環(huán)節(jié)?;谶吘壍膱D像分割邊緣,主要是指結(jié)構(gòu)或灰度級(jí)出現(xiàn)明顯突變的區(qū)域,實(shí)現(xiàn)了不同區(qū)域的有效劃分。對(duì)于圖像而言,其具有不同的灰度,邊緣特征較為明顯,進(jìn)而能夠有效實(shí)現(xiàn)對(duì)圖像的分割。邊緣檢測(cè)的結(jié)果是一個(gè)個(gè)的點(diǎn),并不能作為圖像分割的結(jié)果,必須采用進(jìn)一步的處理。OpenCV中,可在圖像的邊緣檢測(cè)之后,使用findContours尋找到輪廓。即基于輪廓進(jìn)行圖像分割。本課題研究的對(duì)象是數(shù)字驗(yàn)證碼,該驗(yàn)證碼由簡(jiǎn)單的字母和數(shù)字組成,字母和數(shù)字的輪廓差別較大,所以本課題選擇采用更直觀的方法,即用opencv基于邊緣實(shí)現(xiàn)圖像分割。2.2字符識(shí)別方法2.2.1模板匹配分類算法對(duì)于模板匹配而言,顧名思義主要是指在圖像模板與圖像中,尋找相似區(qū)域的一種方法。對(duì)于模板匹配算法而言,其具體運(yùn)用主要通過對(duì)模板庫(kù)的建立,實(shí)現(xiàn)對(duì)被匹配圖像和模板庫(kù)圖像兩者之間的對(duì)比,進(jìn)而根據(jù)模板庫(kù)圖像尋找最匹配圖像的一種方法。對(duì)于文本驗(yàn)證碼而言,當(dāng)其組成成分?jǐn)?shù)字以及字母形狀和大小不變時(shí),便可借助模型匹配分類算法,實(shí)現(xiàn)對(duì)驗(yàn)證碼的識(shí)別。對(duì)于驗(yàn)證碼模板庫(kù)的建立,首先需對(duì)驗(yàn)證碼相關(guān)字符進(jìn)行統(tǒng)計(jì),對(duì)數(shù)字與字母的形狀和大小進(jìn)行搜集確定,進(jìn)而確定相應(yīng)的圖像模板,組成相應(yīng)的模板庫(kù)。對(duì)數(shù)字驗(yàn)證碼進(jìn)行識(shí)別前,數(shù)字驗(yàn)證碼通過預(yù)處理,形成單一字符,模板匹配分類算法通過對(duì)圖像特征的提取,并與模板庫(kù)進(jìn)行相應(yīng)對(duì)比,尋找匹配圖像,進(jìn)而得出驗(yàn)證碼的識(shí)別結(jié)果。對(duì)于模板匹配分類算法而言,其運(yùn)用范圍較窄,具有一定的局限性,對(duì)于存在粘連,扭曲以及噪聲等問題的數(shù)字驗(yàn)證碼,識(shí)別效果較差,僅能對(duì)固定形狀和大小的數(shù)字以及字母所組合而成的數(shù)字驗(yàn)證碼進(jìn)行相應(yīng)識(shí)別,未能得到廣泛應(yīng)用與推廣。2.2.2形狀上下文分類算法對(duì)于形狀上下文分類算法而言,其于2002年被首次提出與運(yùn)用,其在具體運(yùn)用中主要借助對(duì)圖像輪廓樣本點(diǎn)的識(shí)別與采集,實(shí)現(xiàn)對(duì)數(shù)字驗(yàn)證碼的識(shí)別,因此,在借助形狀上下文分類算法實(shí)現(xiàn)對(duì)圖像的識(shí)別時(shí),對(duì)圖像的預(yù)處理主要包括圖像邊緣采樣以及提取等工作,進(jìn)而獲得所提取圖像形狀的點(diǎn)集合。一般主要借助向量集合進(jìn)行呈現(xiàn)。形狀上下文算法充分抓住了識(shí)別對(duì)象的空間信息,對(duì)于非剛性物體而言,其在匹配中,魯棒性特征較為明顯。該算法與模板匹配分類算法具有一定的相似性,均需要對(duì)模板庫(kù)進(jìn)行建立,進(jìn)而通過被匹配對(duì)象與模板代價(jià)矩陣之間的對(duì)比實(shí)現(xiàn)對(duì)數(shù)字字符的識(shí)別,兩者之間代價(jià)越小,代表著被匹配對(duì)象與模板對(duì)象之間具有較高的相似度。該方法在具體運(yùn)用中能夠較強(qiáng)的穩(wěn)定性,應(yīng)用較為廣泛。但是對(duì)于有背景、噪聲點(diǎn)過多的情況,匹配效果很不好。2.2.3人工智能領(lǐng)域的分類算法1.KNN分類算法對(duì)于KNN法而言,又可稱其為k最近鄰法,其相關(guān)理論與技術(shù)已較為成熟。KNN算法對(duì)數(shù)字驗(yàn)證碼進(jìn)行匹配識(shí)別,也就是根據(jù)測(cè)試數(shù)據(jù)與每個(gè)訓(xùn)練集數(shù)據(jù)距離的大小來判斷該測(cè)試數(shù)據(jù)分屬哪個(gè)類別——前提是有一堆已經(jīng)注明好它是哪個(gè)數(shù)字的圖片(這一堆圖片組成訓(xùn)練集,也叫比較集、樣本空間)。對(duì)于KNN算法而言,主要包括三項(xiàng)指標(biāo)數(shù)據(jù):第一,距離,通過被測(cè)試對(duì)象與模板,對(duì)象之間距離的計(jì)算,獲取距離數(shù)據(jù);第二,訓(xùn)練集的確定,訓(xùn)練集主要作為被測(cè)試對(duì)象的模板集;第三k的大小的確定,根據(jù)距離的遠(yuǎn)近,對(duì)K個(gè)訓(xùn)練對(duì)象進(jìn)行確定,并進(jìn)行分類,最后進(jìn)行相應(yīng)測(cè)試。圖1KNN算法識(shí)別流程對(duì)于KNN分類算法而言,其主要通過被測(cè)試對(duì)象與訓(xùn)練集數(shù)據(jù)的對(duì)比,并根據(jù)兩者之間距離的大小對(duì)被測(cè)試對(duì)象進(jìn)行分類的一種算法。該算法在一定程度上能夠有效解決實(shí)驗(yàn)樣本不均的問題,根據(jù)被測(cè)試對(duì)象類別進(jìn)行判斷識(shí)別。該方法操作簡(jiǎn)單便捷,具有簡(jiǎn)單流程。2.神經(jīng)網(wǎng)絡(luò)①人工神經(jīng)網(wǎng)絡(luò)人工神經(jīng)網(wǎng)絡(luò)本質(zhì)上作為一種數(shù)字運(yùn)算模型,主要通過對(duì)人類大腦的模仿,借助神經(jīng)突出,實(shí)現(xiàn)對(duì)信息的處理與傳遞,人工神經(jīng)網(wǎng)絡(luò)于1943被首次提出,一經(jīng)問世,引起廣大學(xué)者的關(guān)注與重視。隨著不斷的研究和發(fā)展,人工神經(jīng)網(wǎng)絡(luò)被廣泛應(yīng)用于各個(gè)領(lǐng)域,有效解決了多種問題,如生物,醫(yī)學(xué),經(jīng)濟(jì),金融,模式識(shí)別等各個(gè)領(lǐng)域。對(duì)于人工神經(jīng)網(wǎng)絡(luò)而言,其核心組成主要包括激勵(lì)函數(shù),網(wǎng)絡(luò)模型結(jié)構(gòu)等。其中,激勵(lì)函數(shù),主要是指神經(jīng)網(wǎng)絡(luò)中大量節(jié)點(diǎn)以及節(jié)點(diǎn)之間的連接構(gòu)成的輸出函數(shù)。②卷積神經(jīng)網(wǎng)絡(luò)CNN相比于人工神經(jīng)網(wǎng)絡(luò),卷積神經(jīng)網(wǎng)絡(luò)擁有更強(qiáng)的網(wǎng)絡(luò)稀疏性和參數(shù)共享性。CNN通常由輸入層,隱藏層,輸出層構(gòu)成,其中隱藏層中常見的有卷積層,池化層和全連接層。其常見的架構(gòu)模式為一個(gè)或幾個(gè)卷積操作后跟著一個(gè)池化操作,以此為一個(gè)單元,重復(fù)數(shù)次。隨后是若干全連接層,最后常使用softmax函數(shù)來處理輸出。相較于單純使用全連接層建構(gòu)的神經(jīng)網(wǎng)絡(luò)相比,在提升性能的同時(shí),大量減少了參數(shù)量,降低了計(jì)算成本。CNN識(shí)別驗(yàn)證碼不同于將圖片進(jìn)行分割等處理的識(shí)別方法,而是直接對(duì)整個(gè)圖片進(jìn)行學(xué)習(xí)。因此只要驗(yàn)證碼的風(fēng)格與原樣本不同時(shí),識(shí)別準(zhǔn)確率就比較低。對(duì)于卷積神經(jīng)網(wǎng)絡(luò)全連接層而言,其輸入的大小是固定不變的的,在該種情況下,若輸入的向量維數(shù)發(fā)生變化,便代表著其權(quán)值參數(shù)發(fā)生變化,使得網(wǎng)絡(luò)出現(xiàn)動(dòng)態(tài)變化問題,進(jìn)而無法達(dá)到預(yù)期效果器。所以,即使是同樣的驗(yàn)證碼如果改變了圖片的大小,程序就會(huì)報(bào)錯(cuò)。卷積神經(jīng)網(wǎng)絡(luò)由多層網(wǎng)絡(luò)結(jié)構(gòu)組成,特別適合圖像識(shí)別等任務(wù),但缺點(diǎn)是需要極大量的訓(xùn)練數(shù)據(jù)集。本課題研究的對(duì)象是由字母和數(shù)字組成的驗(yàn)證碼,相鄰字符之間的重疊部分可以忽略不計(jì),訓(xùn)練集數(shù)量大概是800個(gè)。人工智能領(lǐng)域的分類算法是如今最常用的算法,神經(jīng)網(wǎng)絡(luò)算法需要極大量的訓(xùn)練集,且要通過一個(gè)或多個(gè)卷積層和頂端的全連通層(對(duì)應(yīng)經(jīng)典的神經(jīng)網(wǎng)絡(luò))組成來對(duì)圖像識(shí)別,相對(duì)來說程序更多更復(fù)雜,這里本課題選用了程序更簡(jiǎn)單且識(shí)別率也不錯(cuò)的KNN算法,KNN算法簡(jiǎn)單、有效,重新訓(xùn)練的代價(jià)較低,對(duì)于本課題研究的數(shù)字驗(yàn)證碼來說,KNN可以說是一種最直接的用來分類未知數(shù)據(jù)的方法,較其他方法更為適合,且800張訓(xùn)練集圖片也能滿足該算法的需要。研究過程是:把Python作為實(shí)現(xiàn)軟件,用cv2庫(kù)實(shí)現(xiàn)數(shù)字驗(yàn)證碼圖片的預(yù)處理,再用opencv基于邊緣檢測(cè)后通過輪廓進(jìn)行圖片分割獲得單字符,將單字符進(jìn)行對(duì)應(yīng)信息的標(biāo)注,最后用KNN算法進(jìn)行數(shù)字驗(yàn)證碼的識(shí)別。第三章數(shù)字驗(yàn)證碼識(shí)別的設(shè)計(jì)實(shí)現(xiàn)3.1數(shù)字驗(yàn)證碼識(shí)別的界面對(duì)于PIL而言,其主要作為Python的第三方圖像處理庫(kù)運(yùn)用,因圖像處理效果好,效率高,功能豐富,應(yīng)用較為廣泛,得到大多數(shù)用戶的認(rèn)可。Python創(chuàng)立于20世紀(jì)90年代初,相關(guān)理論與技術(shù)已較為成熟,因其操作簡(jiǎn)單,易學(xué),效率高以及可移植性等特征,得到廣泛運(yùn)用。隨著科技技術(shù)的不斷創(chuàng)新和發(fā)展,PIL版本逐漸升級(jí),功能十分強(qiáng)大。PIL主要用于對(duì)圖像的處理,具體功能主要可分為以下三類:第一,圖像展示功能。通過PIL能夠有效實(shí)現(xiàn)對(duì)圖像的展示,包括多個(gè)接口,如BitmapImage,GUI接口等;第二,圖像處理功能。通過PIL,能夠有效實(shí)現(xiàn)對(duì)圖像點(diǎn)的處理,圖像旋轉(zhuǎn)以及轉(zhuǎn)換圖像顏色空間等,功能十分強(qiáng)大,在我國(guó)圖像處理領(lǐng)域中扮演著重要角色;第三,圖像歸檔功能,通過PIL,能夠有效實(shí)現(xiàn)對(duì)圖像的歸檔處理,以及圖像打印,格式修改,圖像標(biāo)注等。另外,通過PIL能夠有效實(shí)現(xiàn)對(duì)圖像的統(tǒng)計(jì)分析以及對(duì)比度調(diào)整等。這里本課題要搭建一個(gè)簡(jiǎn)單的顯示數(shù)字驗(yàn)證碼識(shí)別結(jié)果的系統(tǒng)界面,所以這里采用了Pythonimagelibrary中的imagedraw模塊功能,通過該模塊,有效實(shí)現(xiàn)了對(duì)2D圖像的制作。同時(shí),通過該模塊,可建立新圖像或?qū)σ延袌D像進(jìn)行編輯,形成所需圖像,滿足數(shù)字驗(yàn)證碼識(shí)別所需。3.2數(shù)字驗(yàn)證碼識(shí)別的實(shí)現(xiàn)驗(yàn)證碼自動(dòng)識(shí)別算法整體過程可分為3大模塊:1)圖片預(yù)處理;2)圖片字符分割;3)字符匹配識(shí)別。其中,識(shí)別過程中又包含建立模板庫(kù)和字符識(shí)別2個(gè)過程。圖2描述了整個(gè)數(shù)字驗(yàn)證碼識(shí)別設(shè)計(jì)的過程。圖2識(shí)別的設(shè)計(jì)過程3.2.1數(shù)字驗(yàn)證碼的圖片預(yù)處理圖3為要識(shí)別的數(shù)字驗(yàn)證碼原始圖片:圖3數(shù)字驗(yàn)證碼原始圖片從圖3中可以很明顯的看到,圖中的字符有扭曲變換的現(xiàn)象。再仔細(xì)觀察,還可以發(fā)現(xiàn)圖片中間的部分出現(xiàn)了一些顆?;男螤?,也就是噪聲。為了讓數(shù)字驗(yàn)證碼識(shí)別過程更加簡(jiǎn)單要進(jìn)行圖片預(yù)處理,通過圖片灰度化、二值化、降噪再二值化,得到易于系統(tǒng)分割的圖片。用Python讀取數(shù)字驗(yàn)證碼圖片,并將圖片轉(zhuǎn)成灰度圖,經(jīng)過cv2庫(kù)的處理,彩色圖片變成了圖4所示的灰度圖:圖4灰度化后的圖片將圖片做二值化處理可得到像素點(diǎn)值只有0或255的二維元組圖片,減少數(shù)據(jù)量便于后續(xù)分割和識(shí)別,這里本課題采用了自定義閾值的方法,將閥值設(shè)定為127,判斷圖像的像素值是否大于127,若>127,則被二值化處理后的圖像像素點(diǎn)值為0,通過黑色呈現(xiàn),若<127時(shí),則被二值化處理后的像素點(diǎn)值為255,通過白色呈現(xiàn),具體如圖5所示:圖5二值化后的圖片從二值化后的圖片上可以看出來有很明顯的斑點(diǎn),說明圖片預(yù)處理到這里還沒有完成,還需要處理圖片中的噪聲,本課題用高斯模糊來對(duì)圖片進(jìn)行降噪。經(jīng)過降噪處理后的圖片如圖6:圖6降噪后的圖片觀察經(jīng)過降噪處理后的圖片,可以看出來有一些顆?;脑肼暠黄交袅?,之前圖片上的斑點(diǎn)也變得模糊了。但是降噪后的圖片相比之前也變得更模糊了,為了便于之后對(duì)圖片的分割,對(duì)圖片再做一輪二值化處理,得到僅有像素值為0和255的黑白清晰圖片。即經(jīng)過第二次二值化處理后得到了圖7:圖7第二次二值化后的圖片上述用cv2庫(kù)進(jìn)行的圖像預(yù)處理的相關(guān)功能程序如下:#用來處理圖片數(shù)據(jù)集?;叶然?、二值化和降噪

defprocess_im(im):

rows,cols,ch=im.shape

#轉(zhuǎn)為灰度圖

im_gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)

#二值化,就是黑白圖。字符變成白色的,背景為黑色

ret,im_inv=cv2.threshold(im_gray,127,255,cv2.THRESH_BINARY_INV)

#應(yīng)用高斯模糊對(duì)圖片進(jìn)行降噪。高斯模糊的本質(zhì)是用高斯核和圖像做卷積。就是去除一些斑斑點(diǎn)點(diǎn)的。因?yàn)槎祷y免不夠完美,去噪使得二值化結(jié)果更好

kernel=1/16*np.array([[1,2,1],[2,4,2],[1,2,1]])

im_blur=cv2.filter2D(im_inv,-1,kernel)

#再進(jìn)行一次二值化。

ret,im_res=cv2.threshold(im_blur,127,255,cv2.THRESH_BINARY)

returnim_res圖片分割是為了分割出數(shù)字驗(yàn)證碼圖片中的單字符,本課題在這一模塊的目標(biāo)是得到經(jīng)過圖片預(yù)處理后的單字符圖片。本課題采用基于邊緣進(jìn)行分割的方法,opencv中正好有很簡(jiǎn)便的方法可以檢測(cè)圖片中字符的輪廓,opencv的findContours方法可以將圖片中的字符輪廓用矩形框框起來,這與本課題要達(dá)到的效果正好符合,因?yàn)楸菊n題處理的對(duì)象是包含字母和數(shù)字的復(fù)雜數(shù)字驗(yàn)證碼,而正常的字母和數(shù)字符號(hào)都是獨(dú)立的,用矩形框也能很好的框住。用該方法處理字符不粘連扭曲的數(shù)字驗(yàn)證碼圖片的效果如圖8:圖8正常分割的圖片從圖中可以觀察到,每個(gè)字符都可以被檢測(cè)出來,所以這種情況可以正常分割4個(gè)字符。這一步的功能模塊代碼為:#定義函數(shù)get_rect_box,目的在于獲得切割圖片字符位置和寬度

defget_rect_box(contours):

#定義ws和valid_contours數(shù)組,用來存放圖片寬度和訓(xùn)練數(shù)據(jù)集中的圖片。如果分割錯(cuò)誤的話需要重新分割

ws=[]

valid_contours=[]

forcontourincontours:

#畫矩形用來框住單個(gè)字符,x,y,w,h四個(gè)參數(shù)分別是該框子的x,y坐標(biāo)和長(zhǎng)寬。因

x,y,w,h=cv2.boundingRect(contour)#計(jì)算圖像一系列點(diǎn)的外部矩形邊界

ifw<7:

continue

valid_contours.append(contour)

ws.append(w)

#w_min是二值化白色區(qū)域最小寬度,目的用來分割。

w_min=min(ws)

#w_max是最大寬度

w_max=max(ws)

result=[]

#如果切割出有4個(gè)字符。說明沒啥問題

iflen(valid_contours)==4:

forcontourinvalid_contours:

x,y,w,h=cv2.boundingRect(contour)

box=0([[x,y],[x+w,y],[x+w,y+h],[x,y+h]])#將矩形的四個(gè)角的坐標(biāo)點(diǎn)取整

result.append(box)但這只是理想情況,其實(shí)很多數(shù)字驗(yàn)證碼圖片中的字符有扭曲粘連的現(xiàn)象,因此可能會(huì)有扭曲粘連的相鄰字符被識(shí)別成同一個(gè)字符,要處理這種情況就要對(duì)數(shù)字驗(yàn)證碼圖片做進(jìn)一步的分割。在數(shù)字驗(yàn)證碼的分割過程中,字符粘連會(huì)有下面幾種情況,每種情況都有它的處理方法:4個(gè)字符被檢測(cè)為3個(gè)字符圖9輪廓粘連的圖片①如圖9只能檢測(cè)出3個(gè)矩形框,中間2個(gè)字符因?yàn)檎尺B被檢測(cè)成了1個(gè)字符。對(duì)于這種情況,可以從中間分割2個(gè)粘連的字符,這樣就可以得到正常的能分割出4個(gè)字符的結(jié)果,該模塊的功能代碼如下:#如果切割出有3個(gè)字符。參照文章,中間分割

eliflen(valid_contours)==3:

forcontourinvalid_contours:

x,y,w,h=cv2.boundingRect(contour)

ifw==w_max:

box_left=0([[x,y],[x+w/2,y],[x+w/2,y+h],[x,y+h]])

box_right=0([[x+w/2,y],[x+w,y],[x+w,y+h],[x+w/2,y+h]])

result.append(box_left)

result.append(box_right)

else:

box=0([[x,y],[x+w,y],[x+w,y+h],[x,y+h]])

result.append(box)代碼實(shí)現(xiàn)后,得到了圖10的效果:圖10改進(jìn)后分割字符數(shù)正常的圖片①4個(gè)字符被檢測(cè)為2個(gè)字符4個(gè)字符被檢測(cè)成2個(gè)字符有下面兩種情況:(1)第一種情況,圖片被檢測(cè)為左右各一個(gè)矩形框,每個(gè)矩形框框住粘連的兩個(gè)字符。圖11輪廓粘連的圖片②對(duì)于左右這兩個(gè)輪廓,可以分別從中間分割。同上述將粘連的兩個(gè)字符分割的功能代碼,代碼實(shí)現(xiàn)后,分割圖片如圖12:圖12改進(jìn)后分割字符數(shù)正常的圖片②(2)對(duì)第二種情況,圖片被檢測(cè)出2個(gè)矩形框,一個(gè)矩形框包含1個(gè)字符,另一個(gè)矩形框包含了3個(gè)字符。圖13輪廓粘連的圖片③可以通過將包含3個(gè)字符的輪廓在水平方向上三等分來解決該情況,該功能代碼如下:#如果切割出有3個(gè)字符。參照文章,將包含了3個(gè)字符的輪廓在水平方向上三等分

eliflen(valid_contours)==2:

forcontourinvalid_contours:

x,y,w,h=cv2.boundingRect(contour)

ifw==w_maxandw_max>=w_min*2:

box_left=0([[x,y],[x+w/3,y],[x+w/3,y+h],[x,y+h]])

box_mid=0([[x+w/3,y],[x+w*2/3,y],[x+w*2/3,y+h],[x+w/3,y+h]])

box_right=0([[x+w*2/3,y],[x+w,y],[x+w,y+h],[x+w*2/3,y+h]])

result.append(box_left)

result.append(box_mid)

result.append(box_right)

elifw_max<w_min*2:

box_left=0([[x,y],[x+w/2,y],[x+w/2,y+h],[x,y+h]])

box_right=0([[x+w/2,y],[x+w,y],[x+w,y+h],[x+w/2,y+h]])

result.append(box_left)

result.append(box_right)

else:

box=0([[x,y],[x+w,y],[x+w,y+h],[x,y+h]])

result.append(box)代碼實(shí)現(xiàn)后,分割圖片如圖14:圖14改進(jìn)后分割字符數(shù)正常的圖片③4個(gè)字符被檢測(cè)成1個(gè)字符如圖15,經(jīng)過系統(tǒng)處理只顯示了一個(gè)矩形框,這是由于圖片上的4個(gè)字符粘連在一起所以只能被檢測(cè)為1個(gè)字符。圖15輪廓粘連的圖片④這種情況對(duì)輪廓在水平方向上做4等分即可,該功能的代碼如下:#如果切割出有1個(gè)字符。參照文章,對(duì)輪廓在水平方向上做4等分

eliflen(valid_contours)==1:

contour=valid_contours[0]

x,y,w,h=cv2.boundingRect(contour)

box0=0([[x,y],[x+w/4,y],[x+w/4,y+h],[x,y+h]])

box1=0([[x+w/4,y],[x+w*2/4,y],[x+w*2/4,y+h],[x+w/4,y+h]])

box2=0([[x+w*2/4,y],[x+w*3/4,y],[x+w*3/4,y+h],[x+w*2/4,y+h]])

box3=0([[x+w*3/4,y],[x+w,y],[x+w,y+h],[x+w*3/4,y+h]])

result.extend([box0,box1,box2,box3])

eliflen(valid_contours)>4:

forcontourinvalid_contours:

x,y,w,h=cv2.boundingRect(contour)

box=0([[x,y],[x+w,y],[x+w,y+h],[x,y+h]])

result.append(box)

result=sorted(result,key=lambdax:x[0][0])

returnresult代碼實(shí)現(xiàn)后,分割圖片如圖16:圖16改進(jìn)后分割字符數(shù)正常的圖片④3.2.2數(shù)字驗(yàn)證碼的字符匹配和識(shí)別字符匹配對(duì)圖片分割完成后,要將分割后的單個(gè)字符的圖片分別儲(chǔ)存,以便下一步做人工標(biāo)注。存取字符圖片的代碼如下:#借助第一個(gè)函數(shù)獲得待切割位置和長(zhǎng)寬后就可以切割了,切割后放在char文件夾下

defsplit_code(filepath):

#獲取圖片名

filename=filepath.split("/")[-1]

#圖片名即為標(biāo)簽

filename_ts=filename.split(".")[0]

im=cv2.imread(filepath)

im_res=process_im(im)

im2,contours,hierarchy=cv2.findContours(im_res,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

#這里就是用的第一個(gè)函數(shù),獲得待切割位置和長(zhǎng)寬

boxes=get_rect_box(contours)

#如果沒有區(qū)分出四個(gè)字符,就不切割這個(gè)圖片

iflen(boxes)!=4:

print(filepath)

#如果區(qū)分出了四個(gè)字符,說明切割正確,就可以切割這個(gè)圖片。將切割后的圖片保存在char文件夾下

forboxinboxes:

print(box)

cv2.drawContours(im,[box],0,(0,0,255),2)

roi=im_res[box[0][1]:box[3][1],box[0][0]:box[1][0]]

roistd=cv2.resize(roi,(30,30))

timestamp=int(time.time()*1e6)

filename="{}.jpg".format(timestamp)

filepath=os.path.join("char",filename)

print(filepath)

cv2.imwrite(filename,roistd)字符圖片保存在名為char的目錄下面,這個(gè)目錄里的文件大致是長(zhǎng)這樣的(文件名用時(shí)間戳命名,確保不會(huì)重名):圖17分割出的單字符圖片標(biāo)注數(shù)據(jù)是所有步驟里最耗費(fèi)體力的一步了。依次打開char目錄中的每張被標(biāo)注圖像,通過操作計(jì)算機(jī),實(shí)現(xiàn)對(duì)圖像字符名的命名,并將其進(jìn)行保存。該功能的代碼如下:#用來標(biāo)注單個(gè)字符圖片,在label文件夾下,很明顯可以看到_后面的就是標(biāo)簽。比如圖片里是數(shù)字6,_后面就是6

deflabel_data():

files=os.listdir("char")

forfilenameinfiles:

print(filename)

filename_ts=filename.split(".")[0]

patt="label/{}_*".format(filename_ts)

saved_num=len(glob.glob(patt))

ifsaved_num==1:

print("{}done".format(patt))

continue

filepath=os.path.join("char",filename)

im=cv2.imread(filepath)

cv2.imshow("image",im)

key=cv2.waitKey(0)

ifkey==27:

sys.exit()

ifkey==13:

continue

char=chr(key)

filename_ts=filename.split(".")[0]

outfile="{}_{}.jpg".format(filename_ts,char)

outpath=os.path.join("label",outfile)

cv2.imwrite(outpath,im)

#和標(biāo)注字符圖反過來,我們需要讓電腦知道這個(gè)字符叫啥名字

defanalyze_label():

files=os.listdir("label")

label_count={}

forfilenameinfiles:

label=filename.split(".")[0].split("_")[1]

label_count.setdefault(label,0)

label_count[label]+=1

print(label_count)通過對(duì)圖片進(jìn)行標(biāo)注后,將其保存至下列模板庫(kù)中,據(jù)統(tǒng)計(jì),共有八百?gòu)垐D片,其中文件名由原文件名+標(biāo)注名組成,如圖18所示:圖18label模板庫(kù)字符識(shí)別本課題采用KNN算法來識(shí)別數(shù)字驗(yàn)證碼。運(yùn)用KNN算法識(shí)別數(shù)字驗(yàn)證碼時(shí),K值的選取非常重要,本課題將K取不同值分別進(jìn)行識(shí)別精確度的計(jì)算,從而選出最好的識(shí)別效果對(duì)應(yīng)的K值。對(duì)于每一個(gè)要識(shí)別的數(shù)字驗(yàn)證碼圖片,都需要先對(duì)圖片做圖片預(yù)處理。預(yù)處理主要包括圖片灰度處理,二值化處理,降噪處理以及圖片分割處理等,對(duì)于進(jìn)行預(yù)處理后的圖片,假設(shè)其存在變量im_res內(nèi),圖片分割處理后的相關(guān)輪廓特征存在變量boxes內(nèi),識(shí)別驗(yàn)證碼的代碼如下:#訓(xùn)練模型,用的是k相鄰算法

defget_code(im):

#將讀取圖片和標(biāo)簽

[samples,label_ids,id_label_map]=load_data()

#k相鄰算法

model=cv2.ml.KNearest_create()

#開始訓(xùn)練

model.train(samples,cv2.ml.ROW_SAMPLE,label_ids)

#處理圖片。即二值化和降噪

im_res=process_im(im)

#提取輪廓

im2,contours,hierarchy=cv2.findContours(im_res,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

#獲取各切割區(qū)域位置和長(zhǎng)寬

boxes=get_rect_box(contours)

#判斷有沒有識(shí)別出4個(gè)字符,如果沒有識(shí)別出來就不往下運(yùn)行,直接結(jié)束

iflen(boxes)!=4:

print("cannotgetcode")

result=[]

#如果正確分割出了4個(gè)字符,下面調(diào)用訓(xùn)練好的模型進(jìn)行識(shí)別。

forboxinboxes:

#獲取字符長(zhǎng)寬

roi=im_res[box[0][1]:box[3][1],box[0][0]:box[1][0]]

#重新設(shè)長(zhǎng)寬。

roistd=cv2.resize(roi,(30,30))

#將圖片轉(zhuǎn)成像素矩陣

sample=roistd.reshape((1,900)).astype(np.float32)

#調(diào)用訓(xùn)練好的模型識(shí)別

ret,results,neighbours,distances=model.findNearest(sample,k=1)

#獲取對(duì)應(yīng)標(biāo)簽id

label_id=int(results[0,0])

#根據(jù)id得到識(shí)別出的結(jié)果

label=id_label_map[label_id]

#存放識(shí)別結(jié)果

result.append(label)

returnresult運(yùn)行上面的代碼后得到圖19的運(yùn)行結(jié)果,數(shù)字驗(yàn)證碼中的字符成功被識(shí)別出來:圖19成功識(shí)別字符的運(yùn)行界面第四章結(jié)果分析本課題研究的是具有噪聲且扭曲粘連的數(shù)字驗(yàn)證碼,將訓(xùn)練集數(shù)字驗(yàn)證碼經(jīng)過圖片預(yù)處理和KNN算法識(shí)別匹配后得到的label模型庫(kù)與測(cè)試集數(shù)字驗(yàn)證碼進(jìn)行比較,可得到識(shí)別的精確度。這里本課題將K分別取1、2、3、4,計(jì)算識(shí)別后的精確度,結(jié)果如表1所示:表1不同K值對(duì)應(yīng)的識(shí)別率K值1234識(shí)別精確度94.393%93.692%92.757%92.290%比較識(shí)別精確度可知:K=1時(shí)精確度最高。本課題的程序采用Python語言編寫,取106張測(cè)試集的數(shù)字驗(yàn)證碼圖片(存在test目錄下)進(jìn)行識(shí)別,由實(shí)驗(yàn)結(jié)果可得:識(shí)別的精確度約為:94.393%,該準(zhǔn)確率相對(duì)較高,雖然有部分特征不夠明顯的數(shù)字驗(yàn)證碼圖片因字符輪廓不規(guī)范出現(xiàn)了識(shí)別錯(cuò)誤的情況,但總體來說識(shí)別效果不錯(cuò)。利用Python搭建系統(tǒng)界面,界面效果要展示出數(shù)字驗(yàn)證碼識(shí)別的結(jié)果。界面展示的是測(cè)試集的識(shí)別結(jié)果,測(cè)試集中大概有100張左右的數(shù)字驗(yàn)證碼圖片,對(duì)于用于測(cè)試的樣本,前2個(gè)過程與建立模板庫(kù)的過程相同,測(cè)試集圖片經(jīng)過圖像預(yù)處理后,再用KNN算法識(shí)別測(cè)試集圖片字符,本課題分析比較了不同K值的識(shí)別精確度,發(fā)現(xiàn)K取1時(shí)精確度最高,所以找到模板庫(kù)中與目標(biāo)字符距離最小的1個(gè)字符后,再根據(jù)字符模板庫(kù)label對(duì)字符進(jìn)行識(shí)別。最后要用系統(tǒng)界面展示識(shí)別結(jié)果,這里本課題用PIL庫(kù)ImageDraw模塊中的Draw和text方法將識(shí)別結(jié)果展示出來,運(yùn)行后的系統(tǒng)界面如圖20:圖20識(shí)別結(jié)果的系統(tǒng)界面第五章總結(jié)隨著互聯(lián)網(wǎng)技術(shù)的普及,我國(guó)科技技術(shù)的不斷發(fā)展,網(wǎng)絡(luò)成為人們生活中重要的組成成分,其在不斷提高人們生活質(zhì)量與豐富人們生活的同時(shí),也帶來了網(wǎng)絡(luò)安全隱患問題。因此,為有效提高網(wǎng)絡(luò)安全性,保障人們網(wǎng)絡(luò)安全隱私,我國(guó)不斷的研發(fā)與提高網(wǎng)絡(luò)防火墻的安全性與抵抗力,其中,數(shù)字驗(yàn)證碼便是其中之一。數(shù)字驗(yàn)證碼的運(yùn)用主要用于對(duì)人類計(jì)算機(jī)使用與自動(dòng)化程序使用的辨別,避免或減少出現(xiàn)密碼惡意破解,違規(guī)使用網(wǎng)絡(luò)資源,惡意刷帖,垃圾注冊(cè),刷票,垃圾廣告,惡意登錄,活動(dòng)作弊等違法行為,該類行為一旦發(fā)生,不僅僅影響網(wǎng)站的推廣與應(yīng)用,甚至嚴(yán)威脅著我國(guó)社會(huì)公平,公正與公義,對(duì)我國(guó)人民群眾的權(quán)益造成一定損害,不利于我國(guó)互聯(lián)網(wǎng)的發(fā)展。同時(shí),隨著互聯(lián)網(wǎng)的不斷發(fā)展,互聯(lián)網(wǎng)將應(yīng)用至人們生活的方方面面,若僅通過政府等相關(guān)部門出臺(tái)法律法規(guī)對(duì)互聯(lián)網(wǎng)違法行為進(jìn)行約束,雖然在一定程度上提高了違法成本,但互聯(lián)網(wǎng)的龐大與復(fù)雜性,必然存在一部分不法分子逍遙在外,因此,不斷的提高網(wǎng)絡(luò)的安全性,才是我國(guó)未來互聯(lián)網(wǎng)發(fā)展的重要趨勢(shì)與重要保障。隨著數(shù)字驗(yàn)證碼的逐漸發(fā)展與應(yīng)用,其技術(shù)將不斷的進(jìn)行創(chuàng)新與提高,實(shí)現(xiàn)智能無感知數(shù)字驗(yàn)證碼識(shí)別是未來發(fā)展趨勢(shì),不斷的提高互聯(lián)網(wǎng)使用的安全性能,為用戶提供更優(yōu)的體驗(yàn),滿足人們各種所需,是未來互聯(lián)網(wǎng)發(fā)展的必要選擇。本課題研究的對(duì)象是數(shù)字驗(yàn)證碼,因?yàn)榧償?shù)字驗(yàn)證碼僅有10個(gè)數(shù)字,提取出來的模板數(shù)較少,所以這里我采用的不是純數(shù)字驗(yàn)證碼,而是包含數(shù)字和字母的復(fù)雜數(shù)字驗(yàn)證碼,可以提取出更多的模板。本文以數(shù)字驗(yàn)證碼識(shí)別技術(shù)作為研究對(duì)象,探究當(dāng)前國(guó)內(nèi)外研究現(xiàn)狀,并對(duì)數(shù)字驗(yàn)證碼識(shí)別技術(shù)所包含的三大功能模塊進(jìn)行具體敘述,分別是圖片預(yù)處理技術(shù),圖片分割技術(shù)以及字符匹配識(shí)別功能。在圖片預(yù)處理技術(shù)使用中,用加權(quán)平均法進(jìn)行灰度化,將由RGB三通道的數(shù)據(jù)組成的彩色圖像變?yōu)閱瓮ǖ赖臄?shù)據(jù)的灰度圖像,減少數(shù)據(jù)處理量;用全局閾值中的自定義閾值方法對(duì)圖片進(jìn)行二值化處理;借助高斯模糊實(shí)現(xiàn)對(duì)被二值化圖像的處理,減少噪聲,達(dá)到降噪效果。在數(shù)字驗(yàn)證碼識(shí)別的整個(gè)過程中,圖片分割在其中扮演著重要角色,作為最重要的一步,直接影響著數(shù)字驗(yàn)證碼的識(shí)別效果,本文中,通過運(yùn)用OpenCV根據(jù)圖片中的字符輪廓進(jìn)行分割。本文還研究了對(duì)輪廓探測(cè)出的不同數(shù)量字符的分割方法。在匹配識(shí)別階段,要對(duì)分割出的單字符進(jìn)行信息的人工標(biāo)注,這是本文研究過程中較為繁瑣的一步,最后再用KNN算法對(duì)測(cè)試集數(shù)據(jù)進(jìn)行數(shù)字驗(yàn)證碼的識(shí)別。訓(xùn)練集和測(cè)試集均為從網(wǎng)上找到的不知名網(wǎng)站的排版相似的字符圖片。這里訓(xùn)練集的圖片作為進(jìn)行圖片預(yù)處理、分割和單字符匹配的樣本集,最終得到標(biāo)注好單字符信息的label模型庫(kù)。測(cè)試集圖片用于最終識(shí)別精確度和本課題研究結(jié)果的分析。本課題目前的研究工作還存在一些問題,本人認(rèn)為需從以下三方面解決:第一,對(duì)于數(shù)字驗(yàn)證碼中存在較為嚴(yán)重粘連,扭曲的文字與符號(hào),對(duì)其驗(yàn)證碼識(shí)別技術(shù)仍需進(jìn)一步改進(jìn),同時(shí),對(duì)于因字符分割而產(chǎn)生的字符筆畫出現(xiàn)缺損問題需加強(qiáng)技術(shù)優(yōu)化;第二,在本文中,通過分析比較幾種識(shí)別算法后選擇了一種算法進(jìn)行數(shù)字驗(yàn)證碼識(shí)別,可以用其他識(shí)別算法進(jìn)行研究,探索出更高識(shí)別率的方案;第三,在本文研究中,對(duì)數(shù)字驗(yàn)證碼的處理對(duì)象是四字驗(yàn)證碼,字?jǐn)?shù)較為固定,一旦出現(xiàn)隨機(jī)驗(yàn)證碼字?jǐn)?shù),便無法借助本文數(shù)字驗(yàn)證碼識(shí)別技術(shù)進(jìn)行有效識(shí)別,無法達(dá)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論