一、简介
基于matlab纸币币值检测及识别,人民币纸币的识别技术不仅可以应用在自动售货售票上,也可以应用到银行的自动存取款机、手机营业厅的自动交费机等。基于这样的需求,我们设计了一个基于MATLAB的人民币面额识别系统。
二、部分源码
function picture_proces_button_Callback(hObject, eventdata, handles)
set(handles.text2,'String','图像正在处理...');
axes(handles.axes2); %指定需要清空的坐标轴
cla reset;
box on; %在坐标轴四周加上边框
set(handles.axes2,'xtick',[]);
set(handles.axes2,'ytick',[]);
global frame
global C_SS
global number
image= frame ;
image_size=size(image);
dimension=numel(image_size);
if dimension==2
fprintf('%s','灰度图像');
I = image;
elseif dimension==3
fprintf('%s','彩色图像');
I = rgb2gray(image);
end
%% NO.2 预处理 中值滤波 = F0
F0=medfilt2(I,[5,5]);
%% NO.3 阈值处理 = Y0
[T,SM]=graythresh(F0); % Global image threshold using Otsu's method//Otsu法计算阈值
Y0=imbinarize(F0,T); % 原图=阈值分割[Otsu法]
%% NO.4 形态学处理 = bw4
bw1=Y0;
% bw2 = bwareaopen(bw1,30); %删除包含少于30像素的所有对象 //消除噪音
se = strel('disk',2);
% bw3 = imclose(bw2,se); %填补笔帽上的空白
bw4 = imfill(bw1,'holes'); %填充任何孔,以便区域道具可用于 估计每个边界所包围的区域
%% NO.5 提取、识别图像
F=image; % 原始图像
count_100=0; % 设置初值
count_20=0;
count_1=0;
count_5=0;
count_50=0;
count_10=0;
f=bw4;
[L,n]= bwlabel(f);
max(max(L)); % 图像中纸币的个数
% L returns a label matrix返回标签矩阵
% n returns the number of connected objects found in BW返回在BW中找到的已连接对象数
% 例如,以下对find的调用将返回属于第三个对象的所有像素的行索引和列索引:
% 可以使用一个循环来 提取计算和显示特征图像
axes(handles.axes2); % 显示图像
imshow(F);
hold on % So later plotting commands plot on top of the image.
for k = 1:n
[r,c]= find(L == k);%r return 行;c return 列
rbar1 = min(r);
cbar1 = min(c);
rbar2 = max(r);
cbar2 = max(c);
G=F(rbar1:rbar2,cbar1:cbar2,:); % 提取纸币
G1=size(G,1);
G2=size(G,2);
G_feature1=G(1:round(G1*1),round(G2*0.6):round(G2*0.96),:);% 提取纸币特征位置
G_feature1_R=sum(sum(G_feature1(:,:,1))); % R分量
G_feature1_G=sum(sum(G_feature1(:,:,2))); % G分量
G_feature1_B=sum(sum(G_feature1(:,:,3))); % B分量
G_feature1_S=G_feature1_R+G_feature1_G+G_feature1_B;
RGB(1)=G_feature1_R/G_feature1_S; %R分量
RGB(2)=G_feature1_G/G_feature1_S; %G分量
RGB(3)=G_feature1_B/G_feature1_S; %B分量
G_feature1_max=max(RGB);
rgb= find(RGB == G_feature1_max);
% 纸币识别,要求背景必须为黑色
if rgb==1
if RGB(2)<=0.3
count_100=count_100+1;
[r,c]= find(L == k); % 定位
rbar = mean(r);
cbar = mean(c);
plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',10);
plot(cbar,rbar,'Marker','*','MarkerEdgeColor','w'); % 标注 *
text(cbar,rbar,num2str(count_100),'HorizontalAlignment','left','Color','black','FontSize',25); % 标注标号
text(cbar,rbar,' 100','Color','white','FontSize',14);
elseif RGB(3)<=0.3
count_20=count_20+1;
[r,c]= find(L == k); % 定位
rbar = mean(r);
cbar = mean(c);
plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',10);
plot(cbar,rbar,'Marker','*','MarkerEdgeColor','w'); % 标注#
text(cbar,rbar,num2str(count_20),'HorizontalAlignment','left','Color','black','FontSize',25); % 标注标号
text(cbar,rbar,' 20','Color','white','FontSize',14); % 标注面值
else
count_5=count_5+1;
[r,c]= find(L == k); % 定位
rbar = mean(r);
cbar = mean(c);
plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',10);
plot(cbar,rbar,'Marker','*','MarkerEdgeColor','w'); % 标注#
text(cbar,rbar,num2str(count_5),'HorizontalAlignment','left','Color','black','FontSize',25); % 标注标号
text(cbar,rbar,' 5','Color','white','FontSize',14); % 标注面值
end
elseif rgb==2
if RGB(1)>0.3
count_1=count_1+1;
[r,c]= find(L == k); % 定位
rbar = mean(r);
cbar = mean(c);
plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',10);
plot(cbar,rbar,'Marker','*','MarkerEdgeColor','w'); % 标注*
text(cbar,rbar,num2str(count_1),'HorizontalAlignment','left','Color','black','FontSize',25); % 标注标号
text(cbar,rbar,' 1','Color','white','FontSize',14); % 标注面值
else
count_50=count_50+1;
[r,c]= find(L == k); % 定位
rbar = mean(r);
cbar = mean(c);
plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',10);
plot(cbar,rbar,'Marker','*','MarkerEdgeColor','w'); % 标注*
text(cbar,rbar,num2str(count_50),'HorizontalAlignment','left','Color','black','FontSize',25); % 标注标号
text(cbar,rbar,' 50','Color','white','FontSize',14); % 标注面值
end
else
count_10=count_10+1;
[r,c]= find(L == k); % 定位
rbar = mean(r);
cbar = mean(c);
plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',10);
plot(cbar,rbar,'Marker','*','MarkerEdgeColor','w'); % 标注 *
text(cbar,rbar,num2str(count_10),'HorizontalAlignment','left','Color','black','FontSize',25); % 标注标号
text(cbar,rbar,' 10','Color','white','FontSize',14); % 标注面值
end
end
三、运行结果
四、matlab版本
MATLAB R2019a
五、学习与交流
文中不足之处请大家多多指教,学习与交流可以联系企鹅:3752243968
文中部分源码仅供参考,若需要全部代码可以私信