一、简介
基于matlab人民币纸币识别系统,本设计通过提取人民币数字区域的特征,分析对比不同面值人民币的特征区域差别,使用 MATLAB 软件实现对人民币的面值大小的准确识别。仿真结果表明,本系统可以对第五版(2005年)人民币进行准确识别。
二、部分源码
function result = recgnise()
%%%%%声明全局变量%%%%%
global result;
global l;
global x;
global I6;
global I5;
l = getImage(); %读入图像
l1=rgb2gray(l); %将真彩色图像转换为灰度图像
bw1=edge(l1,'sobel', 'both'); %采用sobel算子进行边缘检测
theta=0:179; %定义theta角度范围
r=radon(bw1,theta); %对图像进行Radon变换
%%%%%检测Radon变换矩阵中的峰值所对应的列坐标%%%%
[m,n]=size(r);
c=1;
for i=1:m
for j=1:n
if r(1,1)<r(i,j)
r(1,1)=r(i,j);
c=j;
end
end
end
%%%%%求纸币行起始位置和终止位置%%%%%
[y,x]=size(pic_bwareaopen);
I6=double(pic_bwareaopen);
Y1=zeros(y,1);
for i=1:y
for j=1:x
if(I6(i,j,1)==1)
Y1(i,1)= Y1(i,1)+1;
end
end
end
[temp MaxY]=max(Y1);
%%
%%%%%%求纸币列起始位置和终止位置%%%%%
PY1=MaxY;
while ((Y1(PY1,1)>=50)&&(PY1>1))
PY1=PY1-1;
end
PY2=MaxY;
while ((Y1(PY2,1)>=50)&&(PY2<y))
PY2=PY2+1;
end
IY=pic(PY1:PY2,:,:);
X1=zeros(1,x);
for j=1:x
for i=PY1:PY2
if(I6(i,j,1)==1)
X1(1,j)= X1(1,j)+1;
end
end
end
%%
%%提取并画出背景中的RMB图像%%
PX1=1;
while ((X1(1,PX1)<3)&&(PX1<x))
PX1=PX1+1;
end
PX2=x;
while ((X1(1,PX2)<3)&&(PX2>PX1))
PX2=PX2-1;
end
dw=pic(PY1:PY2,PX1:PX2,:);
dw_gray=rgb2gray(dw);%将真彩色图像RGB转换为灰度强度图像
dw_gray=imadjust(dw_gray,[0,1],[1,0]);%用于调节灰度图像的亮度
dw_bw=im2bw(dw_gray);%灰度图像转变为二值图像
%%
%%分割提取RMB数值图像%%
[m,n]=size(dw_bw);
m1=round(m/3);
m2=round(2*m/3);
n1=round(n/6);
n2=round(n/3);
n3=round(2*n/3);
n4=round(5*n/6);
sum1=sum(sum(dw_bw(m1:m2,n1:n2)));
sum2=sum(sum(dw_bw(m1:m2,n3:n4)));
if sum1>sum2
dw=imrotate(dw,180,'crop');
end
%%
%%图像处理%%
x=dw;
x1=imresize(x,[236,500]);%'缩放图像
z=imcrop(x1,[270,150,160,65]);%对图像进行剪切,选取有效区域
%%
I=imcrop(x1,[130,60,130,65]); %对图像进行剪切,选取有效区域
I1=rgb2gray(I); %转换为灰度图像
I2=medfilt2(I1); %滤波默认窗口
I3=imadjust(I2,[0.3,0.5],[0,1],1); %明暗反转
I4=im2bw(I3);
se=strel('rectangle',[3,3]); %构造结构函数,以长方形构造一个se
I5=imdilate(I4,se); %图像膨胀
I5=imerode(I5,se); %图像腐蚀
I5=~I5;
%%
[p,n]=size(I5);
X1=1;
while(sum(I5(:,X1))<15&&X1<n)
X1=X1+1;
end
X2=n;
while(sum(I5(:,X2))<15&&X2>1)
X2=X2-1;
end
I6=I(:,X1:X2,:);%I6
I7=I4(:,X1:X2); %I7
%%
fR=z(:,:,1);%提取红色分量
fG=z(:,:,2);%提取绿色分量
fB=z(:,:,3);%提取蓝色分量
averageR=mean(mean(fR));
averageG=mean(mean(fG)); %返回RGB元素的平均值
averageB=mean(mean(fB));
%%%通过图像RGb分量判断RMB币值
if averageR-averageG>35
result=100;
else
[m,n]=size(I6);
%通过提取出的数值图像的大小 来判断币值
if(n<=90)
result=1; %一位数值宽度
end
if(n>90&&n<165)
result=5; %一位数值宽度
end
if(n>310)
result=100;%三位数值宽度
end
if(n>=165&&n<310)
I7=I4(:,X1:X2);%I7
se=strel('rectangle',[35,5]);
I8=imdilate(I7,se);
I9=imerode(I8,se);
I10=~I9;
[M,N]=size(I10);
M1=round(M/3);
M2=round(2*M/3);
N1=round(N/2);
ui1=sum(sum(I10(1:M1,1:N1)));
ui2=sum(sum(I10(M1:M2,1:N1)));
ui3=sum(sum(I10(M2:M,1:N1)));
if(ui1>25&&ui2>150&&ui3>25)
result=10;
else
%通过RGB分量判断 20 与 50
r=mean(mean(I6(:,:,1)));
g=mean(mean(I6(:,:,2)));
b=mean(mean(I6(:,:,3)));
if(r>=110)
result=20;
else
result=50;
end
end
end
end
三、运行结果
四、matlab版本
MATLAB R2019a
五、学习与交流
文中不足之处请大家多多指教,学习与交流可以联系企鹅:3752243968
文中部分源码仅供参考,若需要全部代码可以私信