【图像识别】基于RGB和BP神经网络的人民币识别系统含GUI界面
- 课题介绍 
本设计为基于MATLAB的人民币识别系统。带有一个GUI界面。先利用radon进行倾斜校正,根据不同纸币,选择不同维度的参数识别纸币金额,有通过RGB分量识别100元;
通过面额图像的宽度识别1元、5元;通过构建矩形结构体识别10元 ;通过RGB分量识别 20元 与 50元。
1.1 图像识别技术原理
其实,图像识别技术背后的原理并不是很难,只是其要处理的信息比较繁琐。计算机的任何处理技术都不是凭空产生的,它都是学者们从生活实践中得到启发而利用程序将其模拟实现的。计算机的图像识别技术和人类的图像识别在原理上并没有本质的区别,只是机器缺少人类在感觉与视觉差上的影响罢了。人类的图像识别也不单单是凭借整个图像存储在脑海中的记忆来识别的,我们识别图像都是依靠图像所具有的本身特征而先将这些图像分了类,然后通过各个类别所具有的特征将图像识别出来的,只是很多时候我们没有意识到这一点。当看到一张图片时,我们的大脑会迅速感应到是否见过此图片或与其相似的图片。其实在“看到”与“感应到”的中间经历了一个迅速识别过程,这个识别的过程和搜索有些类似。在这个过程中,我们的大脑会根据存储记忆中已经分好的类别进行识别,查看是否有与该图像具有相同或类似特征的存储记忆,从而识别出是否见过该图像。机器的图像识别技术也是如此,通过分类并提取重要特征而排除多余的信息来识别图像。机器所提取出的这些特征有时会非常明显,有时又是很普通,这在很大的程度上影响了机器识别的速率。总之,在计算机的视觉识别中,图像的内容通常是用图像特征进行描述。
- function varargout = main(varargin)
 % MAIN MATLAB code for main.fig
 % MAIN, by itself, creates a new MAIN or raises the existing
 % singleton*.
 %
 % H = MAIN returns the handle to a new MAIN or the handle to
 % the existing singleton*.
 %
 % MAIN('CALLBACK',hObject,eventData,handles,...) calls the local
 % function named CALLBACK in MAIN.M with the given input arguments.
 %
 % MAIN('Property','Value',...) creates a new MAIN or raises the
 % existing singleton*. Starting from the left, property value pairs are
 % applied to the GUI before main_OpeningFcn gets called. An
 % unrecognized property name or invalid value makes property application
 % stop. All inputs are passed to main_OpeningFcn via varargin.
 %
 % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
 % instance to run (singleton)".
 %
 % See also: GUIDE, GUIDATA, GUIHANDLES
 
 % Edit the above text to modify the response to help main
 
 % Last Modified by GUIDE v2.5 29-May-2020 00:04:07
 
 % Begin initialization code - DO NOT EDIT
 gui_Singleton = 1;
 gui_State = struct('gui_Name', mfilename, ...
 'gui_Singleton', gui_Singleton, ...
 'gui_OpeningFcn', @main_OpeningFcn, ...
 'gui_OutputFcn', @main_OutputFcn, ...
 'gui_LayoutFcn', [] , ...
 'gui_Callback', []);
 if nargin && ischar(varargin{1})
 gui_State.gui_Callback = str2func(varargin{1});
 end
 
 if nargout
 [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
 else
 gui_mainfcn(gui_State, varargin{:});
 end
 % End initialization code - DO NOT EDIT
 
 
 % --- Executes just before main is made visible.
 function main_OpeningFcn(hObject, eventdata, handles, varargin)
 % This function has no output args, see OutputFcn.
 % hObject handle to figure
 % eventdata reserved - to be defined in a future version of MATLAB
 % handles structure with handles and user data (see GUIDATA)
 % varargin command line arguments to main (see VARARGIN)
 
 % Choose default command line output for main
 handles.output = hObject;
 
 % Update handles structure
 guidata(hObject, handles);
 
 % UIWAIT makes main wait for user response (see UIRESUME)
 % uiwait(handles.figure1);
 
 
 % --- Outputs from this function are returned to the command line.
 function varargout = main_OutputFcn(hObject, eventdata, handles)
 % varargout cell array for returning output args (see VARARGOUT);
 % hObject handle to figure
 % eventdata reserved - to be defined in a future version of MATLAB
 % handles structure with handles and user data (see GUIDATA)
 
 % Get default command line output from handles structure
 varargout{1} = handles.output;
 
 
 % --- Executes on button press in pushbutton1.
 function pushbutton1_Callback(hObject, eventdata, handles)
 % hObject handle to pushbutton1 (see GCBO)
 % eventdata reserved - to be defined in a future version of MATLAB
 % handles structure with handles and user data (see GUIDATA)
 %% 图像读取
 [filename, pathname] = uigetfile({'*.jpg;*.tif;*.png;*.gif','All Image Files';...
 '*.*','All Files' });
 l = imread([ pathname,filename]);
 axes(handles.axes1)
 imshow(l);
 title('原始图像')
 l1=rgb2gray(l); %将真彩色图像转换为灰度图像
 bw1=edge(l1,'sobel', 'both'); %采用sobel算子进行边缘检测
 handles.bw1=bw1;
 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
 rot=90-c;
 %%
 %%%%%%求纸币列起始位置和终止位置%%%%%
 
 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);
 dw_gray=imadjust(dw_gray,[0,1],[1,0]);
 dw_bw=im2bw(dw_gray);
 handles.dw_bw=dw_bw;
 %%
 %%分割提取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]); %对图像进行剪切,选取有效区域
 handles.I=I;
 I1=rgb2gray(I); %转换为灰度图像
 I2=medfilt2(I1); %滤波默认窗口
 I3=imadjust(I2,[0.3,0.5],[0,1],1); %明暗反转
 I4=im2bw(I3);
 handles.I4=I4;
 se=strel('rectangle',[3,3]); %构造结构函数,以长方形构造一个se
