Matlab-車牌識別
修改優化後代碼鏈接:https://download.csdn.net/download/qq_43571150/12033276
⻋牌自動識別技術的關鍵在於⻋牌定位、字符切割、字符識別及後續處理等
- Hough變換的方法在⻋牌區域變形或圖象被污損情況下容易失效
- 灰度分割則比直線檢測的方法要穩定,但當圖象在有許多與⻋牌的灰度非常相似的區域時,該方法也容易失效
- 紋理分析在遇到類似⻋牌紋理特徵的其他因素干擾時,⻋牌定位正確率也會受到影響
過程&結果👇
Matlab代碼👇
main.m👇
clc;
clear all;
%主要模塊如下:
%顏色信息提取、車牌區域定位、識別、提取、檢測傾斜度、車牌校正
%車牌區域2值化、擦除干擾區域、文字分割、模版匹配、結果輸出
%
%
%% 自動彈出提示框讀入圖片
[fn,pn,fi]=uigetfile('*.jpg','選擇圖片');
I=imread([pn fn]);
figure,imshow(I);title('原始圖像'); %顯示原始圖像
chepailujing=[pn fn];
I_bai=I;
[PY2,PY1,PX2,PX1]=caitu_fenge(I); %圖像分割,車牌定位,並得到車牌的上邊界PY1、下邊界PY2、左邊界PX1、右邊界 PX2
%% 分割車牌區域
[PY2,PY1,PX2,PX1,threshold]=SEC_xiuzheng(PY2,PY1,PX2,PX1); %車牌區域根據面積二次修正
Plate=I_bai(PY1:PY2,PX1:PX2,:);
bw=Plate;figure,imshow(bw);title('車牌圖像');
%根據圖像的傾斜度進行選擇
bw=rgb2gray(bw);figure,imshow(bw);title('灰度圖像');
qingxiejiao=rando_bianhuan(bw); %傾斜校正
bw=imrotate(bw,qingxiejiao,'bilinear','crop');figure,imshow(bw);title('傾斜校正');%取值爲負值向右旋轉
bw=im2bw(bw,graythresh(bw)); %graythresh功能:使用最大類間方差法找到圖片的一個合適的閾值,更好地把一張灰度圖像轉換爲二值圖像
bw=bwmorph(bw,'hbreak',inf); %對二值圖像inf 無窮大的形態學處理,直到圖像不再發生變化, 'hbreak':斷開圖像中的H型連接
bw=bwmorph(bw,'spur',inf); %'spur':去除小的分支(毛刺)
bw=bwmorph(bw,'open',5); %指定的形態學處理5次 'open':進行形態學開運算(即先膨脹後腐蝕)
bw = bwareaopen(bw, threshold); %刪除二值圖像bw中面積小於P的對象,默認情況下conn使用8鄰域
figure,imshow(bw);title('擦除');
bw=~bw;%倒置二進制矩陣bw
figure,imshow(bw);title('擦除反色');
%上下邊框的去除,對圖像進一步裁剪,保證邊框貼近字體
bw=touying(bw); %投影法
figure;imshow(bw);title('Y方向處理');
bw=~bw;
bw=bwareaopen(bw, threshold);
bw=~bw;
[y,x]=size(bw); %對長寬重新賦值
%% 文字分割
fenge=shuzifenge(bw,qingxiejiao);
[m,k]=size(fenge);
%顯示分割圖像結果
figure;
for s=1:2:k-1
subplot(1,k/2,(s+1)/2);imshow(bw( 1:y,fenge(s):fenge(s+1)));
end
%給七張圖片定位
han_zi =bw( 1:y,fenge(1):fenge(2));
zi_mu =bw( 1:y,fenge(3):fenge(4));
zm_sz_1 =bw( 1:y,fenge(5):fenge(6));
zm_sz_2 =bw( 1:y,fenge(7):fenge(8));
shuzi_1 =bw( 1:y,fenge(9):fenge(10));
shuzi_2 =bw( 1:y,fenge(11):fenge(12));
shuzi_3 =bw( 1:y,fenge(13):fenge(14));
%% 識別
%把修正數據讀入
xiuzhenghanzi = imresize(han_zi, [110 55],'bilinear');
xiuzhengzimu = imresize(zi_mu, [110 55],'bilinear');
xiuzhengzm_sz_1 = imresize(zm_sz_1,[110 55],'bilinear');
xiuzhengzm_sz_2 = imresize(zm_sz_2,[110 55],'bilinear');
xiuzhengshuzi_1 = imresize(shuzi_1,[110 55],'bilinear');
xiuzhengshuzi_2 = imresize(shuzi_2,[110 55],'bilinear');
xiuzhengshuzi_3 = imresize(shuzi_3,[110 55],'bilinear');
%把0-9 , A-Z以及省份簡稱的數據存儲方便訪問
hanzishengfen=duquhanzi(imread('cpgui.bmp'),imread('cpguizhou.bmp'),imread('cpjing.bmp'),imread('cpsu.bmp'),imread('cpyue.bmp'));%識別漢字
%數字和字母比例不同
shuzizimu=duquszzm(imread('0.bmp'),imread('1.bmp'),imread('2.bmp'),imread('3.bmp'),imread('4.bmp'),...
imread('5.bmp'),imread('6.bmp'),imread('7.bmp'),imread('8.bmp'),imread('9.bmp'),...
imread('10.bmp'),imread('11.bmp'),imread('12.bmp'),imread('13.bmp'),imread('14.bmp'),...
imread('15.bmp'),imread('16.bmp'),imread('17.bmp'),imread('18.bmp'),imread('19.bmp'),...
imread('20.bmp'),imread('21.bmp'),imread('22.bmp'),imread('23.bmp'),imread('24.bmp'),...
imread('25.bmp'),imread('26.bmp'),imread('27.bmp'),imread('28.bmp'),imread('29.bmp'),...
imread('30.bmp'),imread('31.bmp'),imread('32.bmp'),imread('33.bmp'));
zimu = duquzimu(imread('10.bmp'),imread('11.bmp'),imread('12.bmp'),imread('13.bmp'),imread('14.bmp'),...
imread('15.bmp'),imread('16.bmp'),imread('17.bmp'),imread('18.bmp'),imread('19.bmp'),...
imread('20.bmp'),imread('21.bmp'),imread('22.bmp'),imread('23.bmp'),imread('24.bmp'),...
imread('25.bmp'),imread('26.bmp'),imread('27.bmp'),imread('28.bmp'),imread('29.bmp'),...
imread('30.bmp'),imread('31.bmp'),imread('32.bmp'),imread('33.bmp'));
shuzi = duqushuzi(imread('0.bmp'),imread('1.bmp'),imread('2.bmp'),imread('3.bmp'),imread('4.bmp'),...
imread('5.bmp'),imread('6.bmp'),imread('7.bmp'),imread('8.bmp'),imread('9.bmp'));
%% 識別結果
i=1;
jieguohanzi = shibiehanzi(hanzishengfen,xiuzhenghanzi);shibiejieguo(1,i) =jieguohanzi; i=i+1;
jieguozimu = shibiezimu(zimu,xiuzhengzimu); shibiejieguo(1,i) =jieguozimu; i=i+1;
jieguozm_sz_1= shibiezm_sz(shuzizimu,xiuzhengzm_sz_1); shibiejieguo(1,i) =jieguozm_sz_1;i=i+1;
jieguozm_sz_2= shibiezm_sz(shuzizimu,xiuzhengzm_sz_2); shibiejieguo(1,i) =jieguozm_sz_2;i=i+1;
jieguoshuzi_1= shibieshuzi(shuzi,xiuzhengshuzi_1); shibiejieguo(1,i) =jieguoshuzi_1;i=i+1;
jieguoshuzi_2= shibieshuzi(shuzi,xiuzhengshuzi_2); shibiejieguo(1,i) =jieguoshuzi_2;i=i+1;
jieguoshuzi_3= shibieshuzi(shuzi,xiuzhengshuzi_3); shibiejieguo(1,i) =jieguoshuzi_3;i=i+1;
%對話框顯示顯示
shibiejieguo;
msgbox(shibiejieguo,'識別結果');
caitu_fenge.m👇
function [PY2,PY1,PX2,PX1]=caitu_fenge(I)
[y,x,z]=size(I); %行數/列數/RGB層數
myI=double(I); %將I數據轉換成雙精度型
Y_threshlow=5; %閾值 決定提取的彩圖質量
X_firrectify=5; %干擾因子 適當提高可抗干擾,但是小圖會照成剪裁太多
%% Y 方向
Blue_y=zeros(y,1); %創建y列向量,統計藍色像素點
for i=1:y
for j=1:x
if((myI(i,j,1)<=48) && ((myI(i,j,2)<=100)&&(myI(i,j,2)>=40)) && ((myI(i,j,3)<=200)&&(myI(i,j,3)>=80)))
%藍色像素的判斷條件:R<=48; 40<=G<=100; 80<=B<=200 R:28 G:63 B:138
Blue_y(i,1)= Blue_y(i,1)+1; %統計每行藍色像素點數
end
end
end
baisebili=0; %白色比例
changkuanbi=0; %窗口比例(長寬比)
k=0; %表示進入次數
while(~((baisebili>=0.12)&&(baisebili<=0.5)&&(changkuanbi>=0.20)&&(changkuanbi<=0.6)))%初步改善傾斜
if (k==0) %第一次進來
[temp,MaxY]=max(Blue_y);% Y方向車牌區域確定
%temp(最多點數):所有行中,最多的累積像素點
%MaxY(最多點所在行):該行中藍點最多
if temp<=20 %若藍色像素小於這個值,不符合
msgbox('車牌定位出錯','warning');
pause;
end
PY1=MaxY; %將有最多藍色像素點的行賦值給PY1
while ((Blue_y(PY1,1)>=Y_threshlow)&&(PY1>1)) %尋找圖片上邊界
PY1=PY1-1; %PY1:存儲車牌上邊界值
end
PY2=MaxY; %將有最多藍色像素點的行賦值給PY2
while ((Blue_y(PY2,1)>=Y_threshlow)&&(PY2<y)) %尋找圖片下邊界
PY2=PY2+1;
end
PY1, PY2
%% X 方向
X_threshhigh=(PY2-PY1)/11; %X方向長度,決定了提取的彩圖的質量,適當提高可抗干擾,但是小圖會照成剪裁太多
Blue_x=zeros(1,x); %創建x行向量,統計藍色像素點
for j=1:x
for i=PY1:PY2 %由於已經確定Y方向範圍,因此在此處只需要處理PY1:PY2階段
if((myI(i,j,1)<=65)&&((myI(i,j,2)<=100)&&(myI(i,j,2)>=40))&&((myI(i,j,3)<=160)&&(myI(i,j,3)>=90)))
%藍色像素的判斷條件:R<=65; 40<=G<=100; 90<=B<=160
% R:28 G:63 B:138
Blue_x(1,j)= Blue_x(1,j)+1; %X方向藍色象素點統計
end
end
end
[temp,MaxX]=max(Blue_x); %MaxX表示最多點數所在的行
PX1=MaxX-6*(PY2-PY1); %尋找X方向左邊界
if PX1<=1
PX1=1;
end
while ((Blue_x(1,PX1)<=X_threshhigh)&&(PX1<x)) %閾值
PX1=PX1+1;
end %確定出X方向車牌起點
PX2=MaxX+6*(PY2-PY1); %尋找X方向右邊界
if PX2>=x
PX2=x;
end
while ((Blue_x(1,PX2)<=X_threshhigh)&&(PX2>PX1)) %閾值
PX2=PX2-1;
end %確定出X方向車牌終點
PX1 ,PX2
a=PY2-PY1+1; %寬度
b=PX2-PX1+1; %長度
White=0; %存儲白色區域色素點
for i=PY1:PY2
for j=PX1:PX2
if (std([myI(i,j,1) myI(i,j,2) myI(i,j,3)],1,2)<=22)&&(myI(i,j,1)>=90)&&(myI(i,j,1)<=255)
White= White+1; %白色像素點統計
end
end
end
baisebili=White/(a*b); %白色像素區域比例
changkuanbi=a/b; %寬高比
k=k+1;
%% 藍色區域不是車牌區域
elseif (k~=0)
Blue_y(PY1:PY2,1)=0;
[temp,MaxY]=max(Blue_y);
if temp<=20
msgbox('車牌定位出錯','warning');
pause;
end
PY1=MaxY; %PY1:存儲車牌上邊界值
while ((Blue_y(PY1,1)>=Y_threshlow)&&(PY1>1))%找到圖片上邊界 %閾值爲5
PY1=PY1-1;
end
%PY1:存儲車牌上邊界值
PY2=MaxY;
while ((Blue_y(PY2,1)>=Y_threshlow)&&(PY2<y))%閾值爲5
PY2=PY2+1; %PY2:存儲車牌上邊界值
end
PY1, PY2
%% 2次尋找X方向
X_threshhigh=(PY2-PY1)/15; %決定提取的彩圖質量,適當提高可抗干擾,但是小圖會照成剪裁太多,ganrao
Blue_x=zeros(1,x); %進一步確定X方向的車牌區域
for j=1:x
for i=PY1:PY2
if((myI(i,j,1)<=45)&&((myI(i,j,2)<=90)&&(myI(i,j,2)>=20))&&((myI(i,j,3)<=160)&&(myI(i,j,3)>=80)))
Blue_x(1,j)= Blue_x(1,j)+1;
end
end
end
%從中間向兩邊擴展,但車牌中間某些位置可能出現斷層
%採用增強型兩邊往中間收縮
[temp,MaxX]=max(Blue_x);
PX1=MaxX-6*(PY2-PY1);
if PX1<=1
PX1=1;
end
while ((Blue_x(1,PX1)<=X_threshhigh)&&(PX1<x)) %閾值
PX1=PX1+1;
end %確定出X方向車牌起點
PX2=MaxX+6*(PY2-PY1);
if PX2>=x
PX2=x;
end
while ((Blue_x(1,PX2)<=X_threshhigh)&&(PX2>PX1)) %閾值
PX2=PX2-1;
end %確定出X方向車牌終點
PX1 ,PX2
a=PY2-PY1+1;b=PX2-PX1+1;
White=0;
for i=PY1:PY2
for j=PX1:PX2
if (std([myI(i,j,1) myI(i,j,2) myI(i,j,3)],1,2)<=16)&&(myI(i,j,1)>=90)&&(myI(i,j,1)<=255)
White= White+1; % 白色象素點統計
end
end
end
baisebili=White/(a*b);
changkuanbi=a/b;
k=k+1;
end
end
%%
Y_firrectify=fix((PY2-PY1)/5); %取整 車牌區域修正係數
PY1=PY1-Y_firrectify; %對車牌區域的修正,向上
PY2=PY2+Y_firrectify; %對車牌區域的修正,向下
PX1=PX1-X_firrectify; %對車牌區域的修正
PX2=PX2+X_firrectify; %對車牌區域的修正
SEC_xiuzheng.m👇
function [PY2,PY1,PX2,PX1,threshold]=SEC_xiuzheng(PY2,PY1,PX2,PX1)
S=(PY2-PY1)*(PX2-PX1); %獲得車牌面積
if S<=25000
threshold=50;
Y_secrectify=3;
X_secrectify=3;
elseif S>25000&&S<=45000
threshold=100;
Y_secrectify=-3;
X_secrectify=3;
elseif S>45000&&S<=80000
threshold=200;
Y_secrectify=-3;
X_secrectify=3;
elseif S>80000&&S<=150000
threshold=300;
Y_secrectify=-10;
X_secrectify=-10;
elseif S>150000&&S<=400000
threshold=600;
Y_secrectify=-10;
X_secrectify=-10;
else
threshold=1800;
Y_secrectify=-10;
X_secrectify=-10;
end
PY1=PY1-Y_secrectify;%對車牌區域的進一步修正
PY2=PY2+Y_secrectify;%對車牌區域的進一步修正
PX1=PX1-X_secrectify;%對車牌區域的進一步修正
PX2=PX2+X_secrectify;%對車牌區域的進一步修正
rando_bianhuan.m👇
%傾斜校正
%Radon變換 將原來的函數做了一個空間轉換
%原來的XY平面內的點映射到AB平面上,那麼原來在XY平面上的一條直線的所有的點在AB平面上都位於同一點
%記錄AB平面上的點的積累厚度,便可知XY平面上的線的存在性
function qingxiejiao=rando_bianhuan(I)
I=edge(I);
theta = 1:180;
[R,xp] = radon(I,theta); %radon變換確定傾斜角
[~,J] = find(R>=max(max(R))); %J記錄了傾斜角
qingxiejiao=90-J;
touying.m👇
% 投影法
% 類似灰度直方圖。藉助投影法得到圖像的投影曲線,分析投影曲線獲得圖像中目標的位置信息
% 水平投影是圖像中每一行在Y軸上的投影,統計白色像素點的個數(或者灰度值之和),畫出水平投影曲線
% 經過目標增強和二值化之後,車牌圖像中只有黑白兩種顏色
% 水平投影(即向Y軸投影)之後,水平邊框部分和字符部分出現波峯。
% 觀察曲線,在曲線的上部和下部有兩個極大值,那是車牌的上下邊緣水平投影的結果,中間部分有曲線波動,是字符區域,字符區域一定在兩個波谷之間
% 由曲線的上下兩個極大值分別從上向下和從下向上搜索波谷,由這兩個波谷位置水平分割車牌,截去車牌的上下邊框。搜索的波谷滿足以下條件:
% (1)波谷值小於一個閾值;
% (2)兩波谷之間的垂直距離在一定範圍內(因爲車牌的字符高度有一定範圍)。
function bw_fir = touying(imane_bw)
X_yuzhi=1;
[y,x]=size(imane_bw);
Y_touying=(sum((~imane_bw)'))'; %往左邊投影統計黑點
X_touying=sum((~imane_bw)); %往下面投影
%找黑體邊緣
Y_up=fix(y/2);
Y_yuzhi=mean(Y_touying((fix(y/2)-10):(fix(y/2)+10),1))/1.6;
while ((Y_touying(Y_up,1)>=Y_yuzhi)&&(Y_up>1)) %找到圖片上邊界
Y_up=Y_up-1;
end
Y_down=fix(y/2);
while ((Y_touying(Y_down,1)>=Y_yuzhi)&&(Y_down<y)) %找到圖片上邊界
Y_down=Y_down+1;
end
%去除左邊邊框干擾
%垂直投影是圖像中每一列在X軸上的投影,統計白色像素點的個數(或者灰度值之和),畫出垂直投影曲線
%垂直投影(即向X軸投影)之後,垂直邊框部分和字符部分出現波峯。
%由於車牌第一個字符是漢字,不會出現象“1”這樣的寬度極小的字符,因此垂直投影曲線左側的第一個由波峯轉入波谷的區域可能是左邊框
%增加3個判定條件用以刪除左邊框:
%(1)波峯值較大;
%(2)波谷值較小;
%(3)波峯與波谷的X軸距離較小。
X_right=1;
if (X_touying(1,fix(x/14)))<=X_yuzhi
X_right=fix(x/14);
end
%找黑體邊緣
bw_fir=imane_bw(Y_up:Y_down,X_right:x);
shuzifenge.m👇
%字符分割
%將計算得到車牌區域分割後的圖象,對白色進行水平垂直投影,計算水平垂直峯, 檢測合理的字符高寬比.
%可用與區域分割相同的方法進行峯值的刪除和合並
%對切割出的字符寬度進行統計分析,用以指導切割,對因錯誤切割過寬的字符進行分裂處理
%針對分割出來的字體的寬度與整個車牌的寬度對比,對誤操作字符進行合併
function fenge = shuzifenge(imfenge,qingxiejiao)
[y,x]=size(imfenge);
%% 用函數設定分割閾值
SS=x*y;
if SS<=20000
shedingyuzhi=4;
elseif SS>20000&&SS<=30000
shedingyuzhi=4;
elseif SS>30000&&SS<=50000
shedingyuzhi=4;
elseif SS>50000&&SS<=80000
shedingyuzhi=4;
else
shedingyuzhi=4;
end
ganrao=SS/100;
%定義數組histogram存儲垂直方向的黑點數
histogram=sum(~imfenge);
%% 文字分割
k=1;
for h=1:x-1
if ((histogram(1,h)<=shedingyuzhi)&&(histogram(1,h+1)>shedingyuzhi))||((h==1)&&histogram(1,h)>shedingyuzhi)
fenge(1,k)=h;
k=k+1;
elseif ((histogram(1,h)>shedingyuzhi)&&(histogram(1,h+1)<=shedingyuzhi))||((h==x-1)&&histogram(1,h)>shedingyuzhi)
fenge(1,k)=h+1;
k=k+1;
end
end
k=k-1;%去掉多產生的一個K值
if k<10
msgbox('提取出錯','警告');
pause;
end
%%
if (sum(histogram(1,fenge(1,1):fenge(1,2)))<ganrao)||((fenge(1,2)-fenge(1,1))<(fenge(1,4)-fenge(1,3))/2)
for i=3:k
fenge(1,i-2)=fenge(1,i);
end
end
[m n]=size(fenge);
if n<14
msgbox('提取出錯','警告');
pause;
end
fenge=fenge(1,1:14);
duquhanzi.m👇
function hanzi=duquhanzi(cpgui,cpguizhou,cpjing,cpsu,cpyue)
%imresize:調整圖像大小,對圖像做縮放處理
%rgb2gray:彩色轉灰度
%im2bw:使用閾值變換法把灰度圖像轉換成二值圖像,bilinear雙線性
hanzi(:,:,1) =imresize(im2bw(cpgui,graythresh(rgb2gray(cpgui))),[110 55],'bilinear');
hanzi(:,:,2) =imresize(im2bw(cpguizhou,graythresh(rgb2gray(cpguizhou))),[110 55],'bilinear');
hanzi(:,:,3) =imresize(im2bw(cpjing,graythresh(rgb2gray(cpjing))),[110 55],'bilinear');
hanzi(:,:,4) =imresize(im2bw(cpsu,graythresh(rgb2gray(cpsu))),[110 55],'bilinear');
hanzi(:,:,5) =imresize(im2bw(cpyue,graythresh(rgb2gray(cpyue))),[110 55],'bilinear');
duquszzm.m👇
function shuzizimu = duquszzm(s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,...
s11,s12,s13,s14,s15,s16,s17,s18,s19,s20,...
s21,s22,s23,s24,s25,s26,s27,s28,s29,s30,...
s31,s32,s33,s34)
%imresize:調整圖像大小,對圖像做縮放處理
%rgb2gray:彩色轉灰度
%im2bw:使用閾值變換法把灰度圖像轉換成二值圖像,bilinear雙線性
%0-9 0 1 2 3 4 5 6 7 8 9
%10-15 ABCDE 6-10FGHJK 16-20 LMNPQ 21-25 RSTUV 26-30 WXYZ
shuzizimu(:,:,1) = imresize(im2bw(s1, graythresh(rgb2gray(s1))), [110 55],'bilinear');
shuzizimu(:,:,2) = imresize(im2bw(s2, graythresh(rgb2gray(s2))), [110 55],'bilinear');
shuzizimu(:,:,3) = imresize(im2bw(s3, graythresh(rgb2gray(s3))), [110 55],'bilinear');
shuzizimu(:,:,4) = imresize(im2bw(s4, graythresh(rgb2gray(s4))), [110 55],'bilinear');
shuzizimu(:,:,5) = imresize(im2bw(s5, graythresh(rgb2gray(s5))), [110 55],'bilinear');
shuzizimu(:,:,6) = imresize(im2bw(s6, graythresh(rgb2gray(s6))), [110 55],'bilinear');
shuzizimu(:,:,7) = imresize(im2bw(s7, graythresh(rgb2gray(s7))), [110 55],'bilinear');
shuzizimu(:,:,8) = imresize(im2bw(s8, graythresh(rgb2gray(s8))), [110 55],'bilinear');
shuzizimu(:,:,9) = imresize(im2bw(s9, graythresh(rgb2gray(s9))), [110 55],'bilinear');
shuzizimu(:,:,10) = imresize(im2bw(s10,graythresh(rgb2gray(s10))),[110 55],'bilinear');
shuzizimu(:,:,11) = imresize(im2bw(s11,graythresh(rgb2gray(s11))),[110 55],'bilinear');
shuzizimu(:,:,12) = imresize(im2bw(s12,graythresh(rgb2gray(s12))),[110 55],'bilinear');
shuzizimu(:,:,13) = imresize(im2bw(s13,graythresh(rgb2gray(s13))),[110 55],'bilinear');
shuzizimu(:,:,14) = imresize(im2bw(s14,graythresh(rgb2gray(s14))),[110 55],'bilinear');
shuzizimu(:,:,15) = imresize(im2bw(s15,graythresh(rgb2gray(s15))),[110 55],'bilinear');
shuzizimu(:,:,16) = imresize(im2bw(s16,graythresh(rgb2gray(s16))),[110 55],'bilinear');
shuzizimu(:,:,17) = imresize(im2bw(s17,graythresh(rgb2gray(s17))),[110 55],'bilinear');
shuzizimu(:,:,18) = imresize(im2bw(s18,graythresh(rgb2gray(s18))),[110 55],'bilinear');
shuzizimu(:,:,19) = imresize(im2bw(s19,graythresh(rgb2gray(s19))),[110 55],'bilinear');
shuzizimu(:,:,20) = imresize(im2bw(s20,graythresh(rgb2gray(s20))),[110 55],'bilinear');
shuzizimu(:,:,21) = imresize(im2bw(s21,graythresh(rgb2gray(s21))),[110 55],'bilinear');
shuzizimu(:,:,22) = imresize(im2bw(s22,graythresh(rgb2gray(s22))),[110 55],'bilinear');
shuzizimu(:,:,23) = imresize(im2bw(s23,graythresh(rgb2gray(s23))),[110 55],'bilinear');
shuzizimu(:,:,24) = imresize(im2bw(s24,graythresh(rgb2gray(s24))),[110 55],'bilinear');
shuzizimu(:,:,25) = imresize(im2bw(s25,graythresh(rgb2gray(s25))),[110 55],'bilinear');
shuzizimu(:,:,26) = imresize(im2bw(s26,graythresh(rgb2gray(s26))),[110 55],'bilinear');
shuzizimu(:,:,27) = imresize(im2bw(s27,graythresh(rgb2gray(s27))),[110 55],'bilinear');
shuzizimu(:,:,28) = imresize(im2bw(s28,graythresh(rgb2gray(s28))),[110 55],'bilinear');
shuzizimu(:,:,29) = imresize(im2bw(s29,graythresh(rgb2gray(s29))),[110 55],'bilinear');
shuzizimu(:,:,30) = imresize(im2bw(s30,graythresh(rgb2gray(s30))),[110 55],'bilinear');
shuzizimu(:,:,31) = imresize(im2bw(s31,graythresh(rgb2gray(s31))),[110 55],'bilinear');
shuzizimu(:,:,32) = imresize(im2bw(s32,graythresh(rgb2gray(s32))),[110 55],'bilinear');
shuzizimu(:,:,33) = imresize(im2bw(s33,graythresh(rgb2gray(s33))),[110 55],'bilinear');
shuzizimu(:,:,34) = imresize(im2bw(s34,graythresh(rgb2gray(s34))),[110 55],'bilinear');
duqushuzi.m👇
function shuzi=duqushuzi(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9)
%imresize:調整圖像大小,對圖像做縮放處理
%rgb2gray:彩色轉灰度
%im2bw:使用閾值變換法把灰度圖像轉換成二值圖像,bilinear雙線性
shuzi(:,:,1) = imresize(im2bw(rgb2gray(s0),graythresh(rgb2gray(s0))),[110 55],'bilinear');
shuzi(:,:,2) = imresize(im2bw(rgb2gray(s1),graythresh(rgb2gray(s1))),[110 55],'bilinear');
shuzi(:,:,3) = imresize(im2bw(rgb2gray(s2),graythresh(rgb2gray(s2))),[110 55],'bilinear');
shuzi(:,:,4) = imresize(im2bw(rgb2gray(s3),graythresh(rgb2gray(s3))),[110 55],'bilinear');
shuzi(:,:,5) = imresize(im2bw(rgb2gray(s4),graythresh(rgb2gray(s4))),[110 55],'bilinear');
shuzi(:,:,6) = imresize(im2bw(rgb2gray(s5),graythresh(rgb2gray(s5))),[110 55],'bilinear');
shuzi(:,:,7) = imresize(im2bw(rgb2gray(s6),graythresh(rgb2gray(s6))),[110 55],'bilinear');
shuzi(:,:,8) = imresize(im2bw(rgb2gray(s7),graythresh(rgb2gray(s7))),[110 55],'bilinear');
shuzi(:,:,9) = imresize(im2bw(rgb2gray(s8),graythresh(rgb2gray(s8))),[110 55],'bilinear');
shuzi(:,:,10) = imresize(im2bw(rgb2gray(s9),graythresh(rgb2gray(s9))),[110 55],'bilinear');
duquzimu.m👇
function zimu = duquzimu(s10,s11,s12,s13,s14,s15,s16,s17,s18,s19,...
s20,s21,s22,s23,s24,s25,s26,s27,s28,s29,...
s30,s31,s32,s33)
%1-5 ABCDE 6-10FGHIJ 11-15 KLMNP 16-20 QRSTU 21-25 VWXYZ
zimu(:,:,1) =imresize(im2bw(s10,graythresh(rgb2gray(s10))),[110 55],'bilinear');
zimu(:,:,2) =imresize(im2bw(s11,graythresh(rgb2gray(s11))),[110 55],'bilinear');
zimu(:,:,3) =imresize(im2bw(s12,graythresh(rgb2gray(s12))),[110 55],'bilinear');
zimu(:,:,4) =imresize(im2bw(s13,graythresh(rgb2gray(s13))),[110 55],'bilinear');
zimu(:,:,5) =imresize(im2bw(s14,graythresh(rgb2gray(s14))),[110 55],'bilinear');
zimu(:,:,6) =imresize(im2bw(s15,graythresh(rgb2gray(s15))),[110 55],'bilinear');
zimu(:,:,7) =imresize(im2bw(s16,graythresh(rgb2gray(s16))),[110 55],'bilinear');
zimu(:,:,8) =imresize(im2bw(s17,graythresh(rgb2gray(s17))),[110 55],'bilinear');
zimu(:,:,9) =imresize(im2bw(s18,graythresh(rgb2gray(s18))),[110 55],'bilinear');
zimu(:,:,10) =imresize(im2bw(s19,graythresh(rgb2gray(s19))),[110 55],'bilinear');
zimu(:,:,11) =imresize(im2bw(s20,graythresh(rgb2gray(s20))),[110 55],'bilinear');
zimu(:,:,12) =imresize(im2bw(s21,graythresh(rgb2gray(s21))),[110 55],'bilinear');
zimu(:,:,13) =imresize(im2bw(s22,graythresh(rgb2gray(s22))),[110 55],'bilinear');
zimu(:,:,14) =imresize(im2bw(s23,graythresh(rgb2gray(s23))),[110 55],'bilinear');
zimu(:,:,15) =imresize(im2bw(s24,graythresh(rgb2gray(s24))),[110 55],'bilinear');
zimu(:,:,16) =imresize(im2bw(s25,graythresh(rgb2gray(s25))),[110 55],'bilinear');
zimu(:,:,17) =imresize(im2bw(s26,graythresh(rgb2gray(s26))),[110 55],'bilinear');
zimu(:,:,18) =imresize(im2bw(s27,graythresh(rgb2gray(s27))),[110 55],'bilinear');
zimu(:,:,19) =imresize(im2bw(s28,graythresh(rgb2gray(s28))),[110 55],'bilinear');
zimu(:,:,20) =imresize(im2bw(s29,graythresh(rgb2gray(s29))),[110 55],'bilinear');
zimu(:,:,21) =imresize(im2bw(s30,graythresh(rgb2gray(s30))),[110 55],'bilinear');
zimu(:,:,22) =imresize(im2bw(s31,graythresh(rgb2gray(s31))),[110 55],'bilinear');
zimu(:,:,23) =imresize(im2bw(s32,graythresh(rgb2gray(s32))),[110 55],'bilinear');
zimu(:,:,24) =imresize(im2bw(s33,graythresh(rgb2gray(s33))),[110 55],'bilinear');
shibiehanzi.m👇
%採用簡單模版匹配算法 D--0,6--8,2--Z,A--4 是比較容易識別出錯的字符
function shibiehanzi=shibiehanzi(hanzi,xiuzhenghanzi);
[y,x,z]=size(xiuzhenghanzi);
for k=1:5
sum=0;
for i=1:y
for j=1:x
if hanzi(i,j,k)==xiuzhenghanzi(i,j) %統計黑白
sum=sum+1;
end
end
end
baifenbi(1,k)=sum/(x*y);
end
chepai= find(baifenbi>=max(baifenbi));
shibiehanzi=chepai;
if shibiehanzi==1
shibiehanzi='桂';
elseif shibiehanzi==2
shibiehanzi='貴';
elseif shibiehanzi==3
shibiehanzi='京';
elseif shibiehanzi==4
shibiehanzi='蘇';
elseif shibiehanzi==5
shibiehanzi='粵';
end
shibieshuzi.m👇
%採用簡單模版匹配算法 D--0,6--8,2--Z,A--4 是比較容易識別出錯的字符
function shibieshuzi=shibieshuzi(shuzi,xiuzhengshuzi_1);
[y,x,z]=size(xiuzhengshuzi_1);
for k=1:10
sum=0;
for i=1:y
for j=1:x
if shuzi(i,j,k)==xiuzhengshuzi_1(i,j)%統計黑白
sum=sum+1;
end
end
end
baifenbi(1,k)=sum/(x*y);
end
chepai= find(baifenbi>=max(baifenbi));
shibieshuzi=chepai-1;
shibieshuzi=num2str(shibieshuzi);
shibiezimu.m👇
%採用簡單模版匹配算法 D--0,6--8,2--Z,A?4 是比較容易識別出錯的字符
function shibiezimu=shibiezimu(zimu,xiuzhengzimu);
[y,x,z]=size(xiuzhengzimu);
for k=1:24
sum=0;
for i=1:y
for j=1:x
if zimu(i,j,k)==xiuzhengzimu(i,j)%統計黑白
sum=sum+1;
end
end
end
baifenbi(1,k)=sum/(x*y);
end
chepai= find(baifenbi>=max(baifenbi));
shibiezimu=chepai;
if shibiezimu==1
shibiezimu='A';
elseif shibiezimu==2
shibiezimu='B';
elseif shibiezimu==3
shibiezimu='C';
elseif shibiezimu==4
shibiezimu='D';
elseif shibiezimu==5
shibiezimu='E';
elseif shibiezimu==6
shibiezimu='F';
elseif shibiezimu==7
shibiezimu='G';
elseif shibiezimu==8
shibiezimu='H';
elseif shibiezimu==9
shibiezimu='J';
elseif shibiezimu==10
shibiezimu='K';
elseif shibiezimu==11
shibiezimu='L';
elseif shibiezimu==12
shibiezimu='M';
elseif shibiezimu==13
shibiezimu='N';
elseif shibiezimu==14
shibiezimu='P';
elseif shibiezimu==15
shibiezimu='Q';
elseif shibiezimu==16
shibiezimu='R';
elseif shibiezimu==17
shibiezimu='S';
elseif shibiezimu==18
shibiezimu='T';
elseif shibiezimu==19
shibiezimu='U';
elseif shibiezimu==20
shibiezimu='V';
elseif shibiezimu==21
shibiezimu='W';
elseif shibiezimu==22
shibiezimu='X';
elseif shibiezimu==23
shibiezimu='Y';
elseif shibiezimu==24
shibiezimu='Z';
end
shibiezm_sz.m👇
%採用簡單模版匹配算法 D--0,6--8,2--Z,A--4 是比較容易識別出錯的字符
function shibiezm_sz=shibiezm_sz(shuzizimu,xiuzhengzm_sz);
[y,x,z]=size(xiuzhengzm_sz);
for k=1:34
sum=0;
for i=1:y
for j=1:x
if shuzizimu(i,j,k)==xiuzhengzm_sz(i,j)%統計黑白
sum=sum+1;
end
end
end
baifenbi(1,k)=double(sum/(x*y));
end
chepai= find(baifenbi>=max(baifenbi));
chepai=chepai(1,1);
%數字直接返回
if (chepai>=1)&&(chepai<=10)
zm_sz=chepai-1;
zm_sz=num2str(zm_sz);
elseif (chepai>=11)&&(chepai<=34)
%字母對應序號轉字母
%11-15 ABCDE 16-20FGHIJ 21-25 KLMNP 26-30 QRSTU 31-35 VWXYZ
if chepai==11
zm_sz='A';
elseif chepai==12
zm_sz='B';
elseif chepai==13
zm_sz='C';
elseif chepai==14
zm_sz='D';
elseif chepai==15
zm_sz='E';
elseif chepai==16
zm_sz='F';
elseif chepai==17
zm_sz='G';
elseif chepai==18
zm_sz='H';
elseif chepai==19
zm_sz='J';
elseif chepai==20
zm_sz='K';
elseif chepai==21
zm_sz='L';
elseif chepai==22
zm_sz='M';
elseif chepai==23
zm_sz='N';
elseif chepai==24
zm_sz='P';
elseif chepai==25
zm_sz='Q';
elseif chepai==26
zm_sz='R';
elseif chepai==27
zm_sz='S';
elseif chepai==28
zm_sz='T';
elseif chepai==29
zm_sz='U';
elseif chepai==30
zm_sz='V';
elseif chepai==31
zm_sz='W';
elseif chepai==32
zm_sz='X';
elseif chepai==33
zm_sz='Y';
elseif chepai==34
zm_sz='Z';
end
end
shibiezm_sz=zm_sz;