【纸币识别】matlab基于数字图像处理的纸币识别系统【源码72期】

一、简介

基于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
文中部分源码仅供参考,若需要全部代码可以私信

  • 46
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的MATLAB人民币识别系统的代码及注释,代码中包含了图片处理和GUI界面的部分代码,但是由于篇幅限制,无法展示完整的代码。需要注意的是,这个代码只是一个简单的示例,具体实现需要根据实际情况进行调整和完善。 ```matlab % 人民币识别系统 % 读取图片 I = imread('rmb.jpg'); % 图片处理:倾斜校正 theta = 1:180; [R, xp] = radon(I, theta); P = max(R, [], 2); [~, idx] = max(P); angle = theta(idx); I = imrotate(I, -angle, 'bilinear', 'crop'); % 图片处理:红色通道处理 I_red = I(:,:,1); I_red = imadjust(I_red, [0.2 0.8], [0 1]); % 图片处理:裁剪图像 I_100 = imcrop(I_red, [50 50 50 50]); I_20 = imcrop(I_red, [100 100 50 50]); I_10 = imcrop(I_red, [150 150 50 50]); I_5 = imcrop(I_red, [200 200 50 50]); I_1 = imcrop(I_red, [250 250 50 50]); % 图片处理:计算面积 area_100 = sum(I_100(:)); area_20 = sum(I_20(:)); area_10 = sum(I_10(:)); area_5 = sum(I_5(:)); area_1 = sum(I_1(:)); % 判断纸币面值 if area_100 > 5000 money = 100; elseif area_20 > 2000 money = 20; elseif area_10 > 1000 money = 10; elseif area_5 > 500 money = 5; elseif area_1 > 250 money = 1; else money = 0; end % 显示结果 figure; imshow(I); title(['Money: ', num2str(money)]); % GUI界面 function rmb_gui % 创建GUI界面 f = figure('Visible', 'off', 'Position', [360, 500, 450, 285]); % 创建上传按钮 uicontrol('Style', 'pushbutton', 'String', 'Select an image',... 'Position', [315,220,100,25],... 'Callback', @upload_callback); % 创建显示面板 hAxes = axes('Units', 'pixels', 'Position', [50, 50, 200, 200]); % 显示结果 function show_result(image, money) axes(hAxes); imshow(image); title(['Money: ', num2str(money)]); end % 上传图片回调函数 function upload_callback(hObject, eventdata) % 打开文件选择窗口 [filename, pathname] = uigetfile({'*.jpg';'*.png'}, 'Select an image file'); if isequal(filename,0) || isequal(pathname,0) return; end % 读取图片 image = imread(fullfile(pathname, filename)); % 图片处理 % ... % 判断纸币面值 % ... % 显示结果 show_result(image, money); end % 显示GUI界面 set(f, 'Name', 'RMB Recognition System', 'NumberTitle', 'off', 'Visible', 'on'); end % 启动GUI界面 rmb_gui(); ``` 以上是一个简单的MATLAB人民币识别系统的代码及注释,仅供参考。如果需要更加完整和复杂的代码,建议参考相关的论文和开项目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值