簡單驗證碼識別 matlab

2022-05-13 18:59:32 字數 3679 閱讀 2444

驗證碼識別, matlab

我看了看這些樣本,發現都是很規則的印刷體數字,而且還沒有角度旋轉,所以我就直接使用數字的面積和周長兩個特徵量來進行檢測,發現效果還是蠻不錯的。

在實驗中,主要問題是『6』和『9』兩個數字的面積和周長都是完全一樣的,所以這時候我又新增了乙個重心的特徵。

有些蛋疼的是數字『4』和『0』竟然面積是一樣的。。。所以只好再引入橢圓離心率特徵來判別。

影象也沒有怎麼預處理,就是簡單的閾值化,再使用ostu分割。

具體**如下

d=dir('*.jpeg'); %讀jpeg檔案

%% 預設模板,每一行對應乙個數字

fd=[56,35.3137084989848,0.651415462867714;

45,41.6568542494924,0.928960924132855;

47,53.4558441227157,0.873324561446361;

54,57.4558441227157,0.842543936832893;

52,35.3137084989848,0.773979329527851;

57,56.9705627484771,0.828808732648540;

61,47.2132034355964,0.727827684501222;

35,41.5563491861041,0.892307587953152;

65,36.9705627484771,0.799839490167419;

61,47.2132034355964,0.727827684501222;

]; for

i=1:64

im=imread(d(i).name); 

i=rgb2gray(im); %灰度化

i(i>140)=255; %簡單閾值化,去除大面積背景干擾,這個再精細的話可以劃分bins,將較大的bins過濾掉。

level=graythresh(i); 

ib=im2bw(i,level); %二值化

cc=bwconncomp(~ib); %尋找閉合區域

l=labelmatrix(cc); %分配目標標籤

area=regionprops(l,'area'); %獲得目標面積

area=[area(:).area]; 

perimeter=regionprops(l,'perimeter'); %獲得目標周長

perimeter=[perimeter(:).perimeter]; 

ecc=regionprops(l,'eccentricity'); %獲得目標離心率

ecc=[ecc(:).eccentricity]; 

centroid=regionprops(l,'centroid'); %獲得目標中心

str=''; 

forj=1:length(area) 

if perimeter(j)>30

%進一步去除小雜訊干擾

nump=[area(j),perimeter(j),ecc(j)]; 

dis=sum((repmat(nump,10,1)-fd).^2,2); 

[~,ind]=min(dis); 

if ind==7||ind==10

% 數字6和9通過豎直方向上的中心判定,這個能用的原因在於資料中數字都是一行上的,平均中心應該在一半高度位置

cet=centroid(j).centroid; 

if cet(2)

ind=10; 

else

ind=7; 

endend

str=[str,num2str(ind-1)]; 

endend

subplot(8,8,i),imshow(im);title(str);hold on 

end部分實驗結果

**裡主要函式

功能:regionprops(英文get the properties of region)用來度量影象區域屬性的函式.常用來統計被標記的區域的面積分布,顯示區域總數。

語法:stats = regionprops(l,properties)

描 述:測量標註矩陣 l中每乙個標註區域的一系列屬性。l 中不同的正整數元素對應不同的區域, 例如:l 中等於整數1的元素對應區域1;l 中等於整數2的元素對應區域2;以此類推。

返回值stats 是乙個長度為 max(l(:))的結構陣列,結構陣列的相應域定義了每乙個區域相應屬性下的度量。 properties 可以是由逗號分割的字串列表,包含字串的單元陣列,單個字串 'all' 或者 'basic'。如果 properties 等於字串 'all',則所有下述字串列表中的度量資料都將被計算,如果properties 沒有指定或者等於 'basic',則屬性 'area'、'centroid' 和'boundingbox' 將被計算。

'area'影象各個區域中畫素總個數

'boundingbox' 包含相應區域的最小矩形

'centroid' 每個區域的質心(重心)

'majoraxislength' 與區域具有相同標準二階中心矩的橢圓的長軸長度(畫素意義下)

'minoraxislength' 與區域具有相同標準二階中心矩的橢圓的短軸長度(畫素意義下)

'eccentricity' 與區域具有相同標準二階中心矩的橢圓的離心率(可作為特徵)

'orientation' 與區域具有相同標準二階中心矩的橢圓的長軸與x軸的交角(度)

'image' 與某區域具有相同大小的邏輯矩陣

'filledimage' 與某區域具有相同大小的填充邏輯矩陣

'filledarea' 填充區域影象中的on畫素個數

'convexhull' 包含某區域的最小凸多邊形

'conveximage' 畫出上述區域最小凸多邊形

'convexarea' 填充區域凸多邊形影象中的on畫素個數

'eulernumber' 幾何拓撲中的乙個拓撲不變數——尤拉數

'extrema' 八方向區域極值點

'equivdiameter' 與區域具有相同面積的圓的直徑

'solidity' 同時在區域和其最小凸多邊形中的畫素比例

'extent' 同時在區域和其最小邊界矩形中的畫素比例

'pixelidxlist' 儲存區域畫素的索引下標

'pixellist' 儲存上述索引對應的畫素座標

'perimeter' 影象各個區域邊界地區的周長

總結

這個問題裡面的樣本實在是太簡單,對於有旋轉的,大小不同的數字驗證碼識別應該對數字提取旋轉不變的特徵點資訊,以及離心率,方向畫素直方圖等多種資訊融合才能得到較好結果。

另外還有一點就是影象的預處理,因為更複雜的驗證碼包含各種雜訊,這就要求字元檢測器有更好的魯棒性。

Matlab驗證碼識別

一 課題介紹 隨著網際網路技術的發展和應用,網路在給人們提供豐富資源和極大便利的同時,伴隨而來的是網際網路系統的安全性問題。而數字驗證碼的出現證書加強web系統安全性的產物。研究數字驗證碼的識別顯得非常有必要。本設計基於matlab hu不變矩,進行數字驗證碼的識別,建立乙個模板庫,採用gui設計介...

驗證碼 簡單驗證碼識別

這裡的驗證碼是內容非常簡單的,結構非常清晰的 這裡的驗證碼是內容非常簡單的,結構非常清晰的 這裡的驗證碼是內容非常簡單的,結構非常清晰的 興之所至之所以說簡單,我覺得是這樣的 抽了五張驗證碼扔進ps,50 透明度,長這樣 只有數字為內容 每張圖的數字都在固定位置 沒有太大的干擾因素 數字字型,形態完...

簡單驗證碼識別

最近幾天比較空閒,於是也模仿網上的文章搞了搞驗證碼識別,當然是那些工整,規則,無碼,無干擾,灰常純淨與單純的驗證碼.當然也看了下網上找到的複雜的驗證碼 車牌號 識別資料,無奈做為乙個半路出家,江湖四流的程式設計師,面對那麼多數學公式只能做罷,一直以自己英語不好而痛心疾首,今天又認識到數學更是障礙,記...