導航:首頁 > 源碼編譯 > 去干擾線演算法

去干擾線演算法

發布時間:2023-01-05 10:00:22

python pil 怎麼去掉驗證碼線條

一、驗證碼識別的概念

機器識別圖片主要的三個步驟為消去背景、切割字元、識別字元。而現有的字元驗證碼也針對這三個方面來設計強壯的驗證碼。

以下簡圖幫助大家理解驗證碼識別的流程:

二、處理流程

其中最為關鍵的就是好圖像處理這一步了。圖像處理功能模塊包括圖像的灰度化、二值化、離散雜訊點的去除、傾斜度校正、字元的切割、圖像的歸一化等圖像處理技術 。

1、 圖像的灰度化
由於 256 色的點陣圖的調色板內容比較復雜,使得圖像處理的許多演算法都沒有辦法展開,因此有必要對它進行灰度處理。所謂灰度圖像就是圖像的每一個像素的 R、G、B 分量的值是相等的。彩色圖像的每個像素的 R、G、B 值是不相同的,所以顯示出紅綠藍等各種顏色。灰度圖像沒有這些顏色差異,有的只是亮度上的不同。灰度值大的像素點比較亮(像素值最大為 255,為白色),反之比較暗(像素值最小為 0,為黑色)。圖像灰度化有各種不同的演算法,比較直接的一種就是給像素的 RGB 值各自一個加權系數,然後求和;同時還要對調色板表項進行相應的處理。

2、 圖像的二值化
要注意的是,最後得到的結果一定要歸一到 0-255 之內。因為這是每個位元組表示
圖像數據的極限。

3、 去噪
圖像可能在生成、傳輸或者採集過程中夾帶了雜訊,去雜訊是圖像處理中常用的手法。通常去雜訊用濾波的方法,比如中值濾波、均值濾波。但是那樣的演算法不適合用在處理字元這樣目標狹長的圖像中,因為在濾波的過程中很有可能會去掉字元本身的像素。

一個採用的是去除雜點的方法來進行去雜訊處理的。具體演算法如下:掃描整個圖像,當發現一個黑色點的時候,就考察和該黑色點間接或者直接相連接的黑色點的個數有多少,如果大於一定的值,那就說明該點不是離散點,否則就是離散點,把它去掉。在考察相連的黑色點的時候用的是遞歸的方法。此處,我簡單的用python實現了,大家可以參考以下。

#coding=utf-8"""
creat time:2015.09.14
"""import cv2import numpy as npfrom matplotlib import pyplot as pltfrom PIL import Image,ImageEnhance,ImageFilter

img_name = '2+.png'#去除干擾線im = Image.open(img_name)#圖像二值化enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
data = im.getdata()
w,h = im.size#im.show()black_point = 0for x in xrange(1,w-1): for y in xrange(1,h-1):
mid_pixel = data[w*y+x] #中央像素點像素值
if mid_pixel == 0: #找出上下左右四個方向像素點像素值
top_pixel = data[w*(y-1)+x]
left_pixel = data[w*y+(x-1)]
down_pixel = data[w*(y+1)+x]
right_pixel = data[w*y+(x+1)] #判斷上下左右的黑色像素點總個數
if top_pixel == 0:
black_point += 1
if left_pixel == 0:
black_point += 1
if down_pixel == 0:
black_point += 1
if right_pixel == 0:
black_point += 1
if black_point >= 3:
im.putpixel((x,y),0) #print black_point
black_point = 0im.show()041424344

原驗證碼:

4、分割
圖像中一般會含有多個數字,識別的時候只能根據每個字元的特徵來進行判斷,所以還要進行字元切割的工作。這一步工作就是把圖像中的字元獨立的切割出來。

具體的演算法如下:

第一步,先自下而上對圖像進行逐行掃描直至遇到第一個黑色的像素點。記錄下來。然後再自上而下對圖像進行逐行掃描直至找到第一個黑色像素,這樣就找到圖像大致的高度范圍。

第二步,在這個高度范圍之內再自左向右逐列進行掃描,遇到第一個黑色像素時認為是字元切割的起始位置,然後繼續掃描,直至遇到有一列中沒有黑色像素,則認為這個字元切割結束,然後繼續掃描,按照上述的方法一直掃描直至圖像的最右端。這樣就得到了每個字元的比較精確寬度范圍。

第三步,在已知的每個字元比較精確的寬度范圍內,按照第一步的方法,分別進行自上而下和自下而上的逐行掃描來獲取每個字元精確的高度范圍。

5、 圖像的歸一化
因為採集的圖像中字元大小有可能存在較大的差異,或者是經過切割後的字元尺寸不統一,而相對來說,統一尺寸的字元識別的標准性更強,准確率自然也更高,歸一化圖像就是要把原來各不相同的字元統一到同一尺寸,在系統實現中是統一到同一高度,然後根據高度來調整字元的寬度。具體演算法如下:先得到原來字元的高度,跟系統要求的高度做比較,得出要變換的系數,然後根據得到的系數求得變換後應有得寬度。在得到寬度和高度之後,把新圖像裡面的點按照插值的方法映射到原圖像中。

不少人認為把每個字元圖像歸一化為 5×9 像素的二值圖像是最理想的,因為圖像的尺寸越小,識別速度就越高,網路訓練也越快。而實際上,相對於要識別的字元圖像, 5×9 像素圖太小了。歸一化後,圖像信息丟失了很多,這時進行圖像識別,准確率不高。實驗證明,將字元圖像歸一化為 10×18 像素的二值圖像是現實中是比較理想的,達到了識別速度快和識別准確率高的較好的平衡點。

三、識別

圖像識別包括特徵提取、樣本訓練和識別三大塊內容。

驗證碼識別其中最為關鍵的就是去噪和分割,這對你的訓練和識別的精度都有著很大的影響。這里只講了大致的流程,其中每個細節都有很多工作要做,這里碼字也很難講清楚,大家可以以這個流程為主線,一步步的實現,最終也就能完成你的需求。

android識別驗證碼圖片的原理與思路

假設已經把驗證碼圖片保存到本地了
我說一下驗證碼識別的大致步驟吧
1,讀取圖片到bitmap
2,進行灰度操作
3,進行才二值操作
4,如果有干擾點 一般用濾波器或八鄰域去干擾點
5,如果有干擾線 如果是簡單的直線可以用掃描法,八後法等,復雜的應該根據特點調整演算法
6,如果有干擾色塊 也應該想法去除
7,如果有較大的傾斜 需要進行適當校正
8,此時得到的應該是比較干凈的字元了,如果是非粘連的可以直接用投影法分割成單個字元
如果有粘連,需要根據圖形特點從演算法上做相應的處理,保證大致分割正確
9,分割成單個字元以後,如果字元比較正常 變形扭曲程序不大,可以直接用模式識別
如果變形扭曲較厲害,一般建議使用神經網路進行訓練後再識別

如果是比較簡單的驗證碼可以使用網上的一些組件,我常用的一個是OcrKingApi

不是太復雜的識別效果還可以,關鍵是免費的。使用文檔可以看一下文庫的鏈接

http://wenku..com/view/b5b6721555270722192ef7b3.html

⑶ 請教生成如圖驗證碼的python演算法

def gene_text():
source = list(string.letters)
for index in range(0,10):
source.append(str(index))
return ''.join(random.sample(source,number))#number是生成驗證碼的位數
然後我們要創建一個圖片,寫入字元串,需要說明的這裡面的字體是不同系統而定,如果沒有找到系統字體路徑的話,也可以不設置
def gene_code():
width,height = size #寬和高
image = Image.new('RGBA',(width,height),bgcolor) #創建圖片
font = ImageFont.truetype(font_path,25) #驗證碼的字體和字體大小
draw = ImageDraw.Draw(image) #創建畫筆
text = gene_text() #生成字元串
font_width, font_height = font.getsize(text)
draw.text(((width - font_width) / number, (height - font_height) / number),text,
font= font,fill=fontcolor) #填充字元串
接下來,我們要在圖片上畫幾條干擾線

#用來繪制干擾線
def gene_line(draw,width,height):
begin = (random.randint(0, width), random.randint(0, height))
end = (random.randint(0, width), random.randint(0, height))
draw.line([begin, end], fill = linecolor)
最後創建扭曲,加上濾鏡,用來增強驗證碼的效果。
image = image.transform((width+20,height+10), Image.AFFINE, (1,-0.3,0,-0.1,1,0),Image.BILINEAR) #創建扭曲
image = image.filter(ImageFilter.EDGE_ENHANCE_MORE) #濾鏡,邊界加強
image.save('idencode.png') #保存驗證碼圖片

⑷ 如何利用Python做簡單的驗證碼識別

1摘要

驗證碼是目前互聯網上非常常見也是非常重要的一個事物,充當著很多系統的防火牆功能,但是隨時OCR技術的發展,驗證碼暴露出來的安全問題也越來越嚴峻。本文介紹了一套字元驗證碼識別的完整流程,對於驗證碼安全和OCR識別技術都有一定的借鑒意義。

然後經過了一年的時間,筆者又研究和get到了一種更強大的基於CNN卷積神經網路的直接端到端的驗證識別技術(文章不是我的,然後我把源碼整理了下,介紹和源碼在這裡面):

基於python語言的tensorflow的『端到端』的字元型驗證碼識別源碼整理(github源碼分享)

2關鍵詞

關鍵詞:安全,字元圖片,驗證碼識別,OCR,Python,SVM,PIL

3免責聲明

本文研究所用素材來自於某舊Web框架的網站完全對外公開的公共圖片資源。

本文只做了該網站對外公開的公共圖片資源進行了爬取,並未越權做任何多餘操作。

本文在書寫相關報告的時候已經隱去漏洞網站的身份信息。

本文作者已經通知網站相關人員此系統漏洞,並積極向新系統轉移。

本報告的主要目的也僅是用於OCR交流學習和引起大家對驗證安全的警覺。

4引言

關於驗證碼的非技術部分的介紹,可以參考以前寫的一篇科普類的文章:

互聯網安全防火牆(1)--網路驗證碼的科普

裡面對驗證碼的種類,使用場景,作用,主要的識別技術等等進行了講解,然而並沒有涉及到任何技術內容。本章內容則作為它的技術補充來給出相應的識別的解決方案,讓讀者對驗證碼的功能及安全性問題有更深刻的認識。

5基本工具

要達到本文的目的,只需要簡單的編程知識即可,因為現在的機器學習領域的蓬勃發展,已經有很多封裝好的開源解決方案來進行機器學習。普通程序員已經不需要了解復雜的數學原理,即可以實現對這些工具的應用了。

主要開發環境:

⑸ 如何快速學習神經網路演算法識別驗證碼

驗證碼都是伺服器生成的圖片,如果是動態的,就是調用servlet生成的,怎麼提取我還不太清楚,不過我想網路上應該會有很多資料。

我現在看的是識別驗證碼的東西,在截取到驗證碼圖片之後,針對這個黑白背景,只有干擾線的驗證碼。

機器學習之識別簡單驗證碼
時間 2016-10-15 22:46:31 隨風'S Blog

主題 數據挖掘
關於驗證碼識別的文章網上很多圖像識別的大神教程也比較多,不過大多數專業性太強了,對非專業人士讀起來簡直是天書,不過隨著機器學習的普及,一大批機器學習的開源工具出現了,這也算對大多數像我一樣的學渣的福音,由於最近項目中牽扯到了一些機器學習相關的東西,所以自己最近也一直在學習機器相關的東西,這篇驗證碼的識別也算是練手了,本文也算是學習中的筆記,所以文章中難免有一些錯誤,歡迎各路大神指點。
由於本人不是相關專業的,對於文中相關演算法就不會具體去討論了,主要以實戰為目的。
准備工作
主要是用到了一些機器學習開源的框架以及一些輔助工具。
Scikit-Learn 比較有名的Python機器學習模塊,主要是操作簡單。
Pybrain Python機器學習模塊,主要以神經網路為核心,所有的訓練方法都以神經網路為一個實例。
pytesseract 圖像識別小工具,本文主要是用來預處理訓練樣本的。
PIL Python圖像處理庫。
問題分析
首先在進行具體工作之前,我們得看看我們需要解決的是什麼問題,那麼對於驗證碼識別來說,可以看作一個分類問題,對於數字的圖片驗證碼來說的話,其實就是0-9數字分類的問題,驗證碼識別最難的部分在於怎麼去將驗證碼進行切割成單個字元圖片,當然對於圖片裁剪也就是特徵提取有很多辦法,例如垂直投影法,等距切割法等等,其中等距切割也是比較簡單的,但是對於稍微復雜一點的驗證碼識別時准確率非常低,因為等距切割時將驗證碼按照相同的寬度進行裁剪,對於那些字元寬度大小不一的,就算裁剪出來也不能很好的表示字元的特徵,所以有時候需要先對圖片進行一系列的預處理,例如字元矯正等等,然後再用垂直投影法在x軸和y軸上按照投影的大小進行裁剪。
對於垂直投影法來說的話,最後我們還得考慮訓練集在維度上都同意,由於是非等級切割,所以每個圖片的像素肯定不一樣,所以為了維度統一還得進行填充,總之稍微麻煩一點。
這里主要是以等距切割為例子,因為在操作起來比較簡單,那麼掩碼也是選用0-9的純數字驗證碼來進行識別,驗證碼如下

這樣的圖片看起來的話間距基本上都差不多大,所以在分割時也比較容易,將圖片切成四塊後,就可以拿每一塊去進行訓練識別了。
使用機器學習來進行訓練和識別的話,我們就得考慮特徵選取了,一般驗證碼識別有一套標準的流程,圖片

對於驗證碼識別來說我們關注的不是驗證碼的顏色,而是字元代表的含義,所以在圖片處理時進行灰度化和二值化以及去噪,比如說去掉干擾線,那麼去噪也有相應的演算法來實現,這里不做具體討論,二值化其實就是將圖片呈現出兩種顏色,即非黑即白,這樣的好處是在特徵處理時可以使用0和1來代表黑色和白色,0和1代表什麼顏色取決於個人喜好。
這樣的話將二值化和其它步驟處理後的圖片進行特徵提取,將黑色像素點標記成1,白色像素點標記成0,這樣就可以得到圖片的數值表示,那麼特徵維度就等於圖片像素的大小,最終將圖片按照X軸或者Y軸表示,即將像素的所標記的值合並到一行,例如
1111100000000000010
1110000000000000000
表示成,這樣每張圖片就可以使用一行0和1的數值來表示。
進行特徵提取之後,我們得到了圖片在數學上的表示,那麼下一步就需要進行模型訓練了,由於如上文所述,圖片識別是一個分類問題,所以在機器學習中,我主要採用了兩種模型來進行訓練, SVM支持向量機 和 BP神經網路 來進行模型訓練,SVM使用scikit-learn機器學習包裡面的實現來做,神經網路使用Pybrain來進行實現。
有關SVM和BP神經網路的演算法部分,大家最好還是去網上搜下相關的Paper,這樣你才能知道什麼演算法能解決什麼問題,以及它大概的原理是什麼樣子的,有能力的同學可以去對推導下這兩個演算法。
實踐
在問題分析部分我們已經對驗證碼識別的大概思路有了一個了解,那麼這部分則主要正對上面所述部分進行具體實現。
首先,我們應該明白SVM和神經網路模型演算法是屬於有監督學習,即需要對樣本進行標注,也就是標記每張圖片表示的是那個數字,但是實際遇到的問題是,如果數據量小的話,我們可以進行人工標注,那麼在數據量比較大的情況下,人工標注可能就不太現實了,所以對於圖片來說的話也一樣,你進行切割完成之後你必須得標注這個數字是幾,所以我們需要對切割的圖片進行預處理,也就是打標記,我比較懶,所以我也不會一個個去打標簽,所以這里使用ocr來對切割的圖片進行預分類,ocr在單文字識別上的效果正確率還是可以的,在ocr進行預分類之後,我們只需要去糾正那些分類錯誤的圖片即可,這樣就能大大的減少工作量。
這里實現主要有以下幾個步驟:
圖片採集
圖片預處理(包括圖片切割,二值化以及圖像增強)
圖片的預分類標注以及手動糾錯標注
特徵提取
模型訓練以及預測
圖片採集
圖片採集就比較簡單,不過多的闡述,如下圖代碼所示

將下載到了圖片按照時間戳存到指定位置

圖片預處理以及圖片裁剪
對圖片進行預處理後採用等距切割法對圖片進行切割

裁剪後的圖片如下

圖片預分類
圖片預分類採用pytesseract來對分割的圖片進行預分類,減輕工作量。
具體代碼如下

ocr的分類效果正確率應該在50%以上,剩下的就是對預分類的圖片進行人工糾錯了。
ocr的分類效果圖

人工糾錯和標記後的結果

每個目錄表示一個類別標簽。
特徵提取
特徵提取的具體內容請參考問題分析中,裡面有詳細的說明。
關鍵代碼如下

最終圖片的數學上表示會以記錄在 /Users/iswin/Downloads/yzm/traindata/train_data.txt 中,數據的格式如下圖所示

紅色線框表示一張圖片數值上的表示,最後一個數字0表示該圖片的類型,我是為了方便把標簽追加到最後一行。
SVM模型分類
這里svm的實現使用了scikit-learn來實現,關於scikit-learn的使用去官網看Tutorial就好了,這里需要說一下SVM關於參數選擇的問題,我們都知道SVM支持多個核函數,例如高斯核、線性核、poly以及sgmoid核函數,但是選擇那麼核函數一開始對於不太熟悉的同學怎麼選擇的確是個問題,所以這里使用了scikit-learn的GridSearchCV來對參數進行最優化選擇,經過參數尋優,這里高斯核的最終效果還是不錯的,所以訓練的時候直接使用高斯核來進行訓練。
為了方便預測時的使用,這里對訓練結果使用了joblib模塊來進行持久化。為了簡單對評價模型進行,這里使用了5折交叉驗證來對結果進行檢驗。
最終結果的准確率在:Accuracy: 0.96 (+/- 0.09)
具體代碼如下:

舉個預測的例子,看看效果

BP神經網路模型分類
BP神經網路也稱負反饋神經網路,即按誤差逆傳播演算法訓練的多層前饋網路,是目前應用最廣泛的神經網路模型之一,在BP神經網路之後,又出現了在深度學習中應用最廣泛的CNN即卷積神經網路,這幾天也正在學習。
本文使用了三層BP神經網路來對訓練集進行訓練,即輸入層+2層隱含層+輸出層,關於BP神經網路本身這里需要注意的是激活函數的選擇以及對於多分類問題輸出層函數選擇的問題,激活函數主要有sigmod、tanh以及relu,關於怎麼選取激活函數,這塊沒有進行深入了解,一般都是每個激活函數都跑一次,看最終效果。
這里的神經網路模型分類主要是對Pybrain用法的學習以及BP神經網路的基本認識,輸入層使用了LinearLayer即線性輸入層,隱含層使用了SigmoidLayer即激活函數為sigmod的隱含層,輸出層由於是多分類問題,所以使用了SoftmaxLayer,最終在神經網路計算的結果中選取數值最大的那個索引位置就是預測的驗證碼類別,也就是0-9之間的數值。
關於Pybrain的資料除了官方文檔不是特別多,關於構建神經網路的方式提供了兩種方式,一種是 buildNetwork 函數來進行構建,另外一種就是使用 FeedForwardNetwork 函數來進行構建,這里需要注意的是如果使用 FeedForwardNetwork 來進行構建的話,注意要手動給各層加上Bias偏置項,否則結果可能可能非常差,當時我實驗時沒加,半天計算結果不對,最後看了下buildNetwork函數的源代碼才發現沒加Bias項,還有就是需要注意迭代至收斂的步數即函數中的 *maxEpochs=500 ,這個根據情況調整,Pybrain有自己的數據集格式,所以在使用時必須按照它的格式來進行數據的初始化。
這里除了輸入層的維度(即驗證碼的訓練集維度)和輸出是固定的之外,其中隱含層的神經元個數也是可以調整的,具體的感興趣的同學自己去調然後再看下結果。
對模型使用10折交叉驗證進行了簡單評估,錯誤率在Total error: 0.062左右,效果比SVM的差一點,應該通參數調優應該可以提高准確率,不過重在學習。
訓練集樣本: /Users/iswin/Downloads/yzm/traindata/train_data_uniq.txt
主要代碼如下:

舉個例子,來看看預測效果

總結
通過這個小實驗,至少讓我對機器學習和相關演算法大致有了一個了解,同時作為安全人員來說至少知道了如何使用開源的機器學習框架來構架自己的模型,筆記中難免會有錯誤之處,歡迎大家提出意見。

⑹ pythonchallenge 去除驗證碼干擾線用什麼演算法好

struct模塊還提供了pack_into() 和 unpack_from()的方法用來解決這樣的問題,也就是對一個已經提前分配好的buffer進行位元組的填充,而不會每次都產生一個新對象對位元組進行存儲。

⑺ 圖像識別新人求教

3.16 icePub_imgToSingleBmp

l 函數原型:
int WINAPI icePub_imgToSingleBmp(char *strImgFilename,char *strBmpFilename,int thresholdValue)
輸入:strImgFilename 待處理圖像文件名
strBmpFilename bmp圖像名
thresholdValue 256級灰度值的閾值(函數會先將圖像轉換成灰度再根據thresholdValue做黑白2值化)
輸出:

VC sample代碼:

typedef int (WINAPI ICEPUB_IMGTOSINGLEBMP)(char *strImgFilename,char *strBmpFilename,int thresholdValue);
ICEPUB_IMGTOSINGLEBMP *icePub_imgToSingleBmp = 0;
HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");
if(hDLLDrv)
{
icePub_imgToSingleBmp=(ICEPUB_IMGTOSINGLEBMP *)GetProcAddress(hDLLDrv,"icePub_imgToSingleBmp");
}
if(icePub_imgToSingleBmp)
{
icePub_imgToSingleBmp("my24.bmp","single1.bmp",150);
icePub_imgToSingleBmp("my.jpg","single2.bmp",150);
icePub_imgToSingleBmp("my.png","single3.bmp",150);
}

if(hDLLDrv)
FreeLibrary(hDLLDrv);

http://dl.icese.net/dev.php?f=icePubDll.rar 下載

⑻ 驗證碼識別,干擾線較粗且顏色與字元相近,要如何去掉干擾線

mutou soft 次世代的驗證碼可以試試。軟體可以去掉干擾線和顏色等信息。

閱讀全文

與去干擾線演算法相關的資料

熱點內容
鋼筋是怎麼加密的 瀏覽:441
二分查找演算法php 瀏覽:518
php產品對比 瀏覽:641
解壓傷感圖片 瀏覽:476
python判斷周幾 瀏覽:17
數據文檔加密保管 瀏覽:168
app會員如何運營 瀏覽:860
工行app登錄名如何改 瀏覽:25
window怎麼登陸伺服器 瀏覽:992
Python取ID對應的值 瀏覽:633
現在我的世界什麼伺服器最混亂 瀏覽:764
美國好的源碼出售 瀏覽:326
蘋果ipad文件夾怎麼添加文字 瀏覽:485
騰訊雲連接自己的伺服器地址 瀏覽:218
碩士英語綜合教程pdf 瀏覽:46
分段加密的安全性 瀏覽:507
咪咕直播為什麼沒有適配安卓系統 瀏覽:172
php模版大全 瀏覽:102
沒車能解壓嗎 瀏覽:634
php開發oa系統源碼 瀏覽:759