搜档网
当前位置:搜档网 › MATLAB100元人民币序列号识别

MATLAB100元人民币序列号识别

I=imread('100.jpg');

%边缘检测
I1=edge(I,'roberts');
figure(1);imshow(I1);

%腐蚀,膨胀
T=[0 1 0;0 1 0;0 1 0];
I2=imerode(I1,T);
figure(2);imshow(I2);

T1=strel('rectangle',[2 19]);
I3=imdilate(I2,T1);
figure(3);imshow(I3);

I4=bwareaopen(I3,2800);
figure(4);imshow(I4);

[w h]=size(I4);

%找上顶点
flag=0;
for i=1:w
for j=1:h
if I4(i, j)==1
aa=i;
flag=1;
break
end
end
if flag==1
break
end
end

%下
flag=0;
for i=w:-1:1
for j=1:h
if I4(i, j)==1
bb=i;
flag=1;
break
end
end
if flag==1;
break
end
end

%左
flag=0;
for j=1:h
for i=1:w
if I4(i, j)==1
cc=j;
flag=1;
break
end
end
if flag==1
break
end
end

%右
flag=0;
for j=h:-1:1
for i=1:w
if I4(i, j)==1
dd=j;
flag=1;
break
end
end
if flag==1;
break
end
end

I5=I(aa:bb,cc: dd);
figure(5);imshow(I5);

%二值化
level = graythresh(I5) ;
I6 = im2bw(I5 ,level) ;
figure(6);imshow(I6);

%反色
[w , h] = size(I6) ;
for i=1:w
for j=1:h
if I6(i,j)==1;
I6(i,j)=0;
else
I6(i,j)=1;
end
end
end

%区域提取
[W , H] = size(I6) ;
for j = 1:H
ss(j) = 0 ;
for i = 1 : W
if(I6(i , j) == 1)
ss(j) = ss(j) + 1 ;
end
end
end
%x = 1:1:H ;
%figure(7) ; plot(x , ss) ;
%找每个字左,右边缘放数组lf,rt
T2 = 1 ;
T1 = 2 ;
m = 1 ;
i = 1 ;
while(i <= H)
len = 0 ;
for j = i : H
if(ss(j) > T2)
len = len + 1 ;
else
break ;
end
end
if(len > T1)
lf(m) = i ;
rt(m) = j - 1 ;
m = m + 1 ;
end
i = j + 1 ;
end
%找上下边缘,放up ,down
for i=1:W
for j=1:10
l=lf(j);
r=rt(j);
for k=l:r
if I6(i, k)==1;
down(j)=i;
break;
end
end
end
end

for i=W:-1:1
for j=1:10
l=lf(j);
r=rt(j);
for k=l:r
if I6(i, k)==1;
up(j)=i;
break;
end
end
end
end

%char1 = I6(up(1):down(1),lf(1):rt(1)) ;
%char2 = I6(up(2):down(2),lf(2):rt(2)) ;
%char3 = I6(up(3):down(3),lf(3):rt(3)) ;
%char4 = I6(up(4):down(4),lf(4):rt(4)) ;
%char5 = I6(up(5):down(5),lf(5):rt(5)) ;
%char6 = I6(up(6):down(6),lf(6):rt(6)) ;
%char7 = I6(up(7):down(7),lf(7):rt(7)) ;
%char8 = I6(up(8):down(8),lf(8):rt(8)) ;
%char9 = I6(up(9):down(9),lf(9):rt(9)) ;
%char10 = I6(up(10):down(10),lf(10):rt(10)) ;

%subplot(1 , 10 , 1) ; imshow(char1) ;
%subplot(1 , 10 , 2) ; imshow(

char2) ;
%subplot(1 , 10 , 3) ; imshow(char3) ;
%subplot(1 , 10 , 4) ; imshow(char4) ;
%subplot(1 , 10 , 5) ; imshow(char5) ;
%subplot(1 , 10 , 6) ; imshow(char6) ;
%subplot(1 , 10 , 7) ; imshow(char7) ;
%subplot(1 , 10 , 8) ; imshow(char8) ;
%subplot(1 , 10 , 9) ; imshow(char9) ;
%subplot(1 , 10 , 10) ; imshow(char10) ;

l1 = length(lf) ;
charset = cell(1 , l1) ;
for i = 1 : l1
charset{i} = I6(up(i):down(i), lf(i):rt(i)) ;
subplot(1 , l1 , i) ; imshow(charset{i}) ;
end

for i = 1 : l1
charset{i} = imresize(charset{i} , [40 20]) ;
subplot(1 , l1 , i) ; imshow(charset{i}) ;
end

str = {'0' , '1' ,'2' , '3' , '4' ,'5' , '6' , '7' ,'8' , '9' ,'A' ,'B', ...
'C' ,'D' ,'E', 'F' ,'G' ,'H','I', 'J' ,'K' ,'L', 'M' ,'N' ,'O', ...
'P' ,'Q' ,'R', 'S' ,'T' ,'U', 'V' ,'W' ,'X', 'Y' ,'Z' , '京' } ;

TmpSet = cell(1 , 37) ;

cd ('Template') ;
for i = 1 : 37
s = strcat(str{i},'.bmp') ;
TmpSet{i} = imread(s)/255 ;
end
cd ..

%计算匹配
for i = 1 : l1
Sam = charset{i} ;
for j = 1 : 37
T = logical(TmpSet{j});
err(j) = 0.0 ;
for m = 1 : 40
for n = 1 : 20
err(j) = err(j) + (Sam(m,n)-T(m,n))*(Sam(m,n)-T(m,n));
end
end
end

min = err(1) ;
minJ = 1 ;
for j = 2 : 37
if (err(j) < min)
min = err(j) ;
minJ = j ;
end
end
TMP(i) = minJ ;
end

result = '识别结果:' ;
for i = 1 : l1
result = strcat(result , str{TMP(i)});
end

title(result);

相关主题