- 课题介绍
本设计为基于MATLAB的人民币识别系统。带有一个GUI界面。先利用radon进行倾斜校正,根据不同纸币,选择不同维度的参数识别纸币金额,有通过RGB分量识别100元;
通过面额图像的宽度识别1元、5元;通过构建矩形结构体识别10元 ;通过RGB分量识别 20元 与 50元。
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; pic=imrotate(l,rot,'crop'); %对图片进行旋转矫正 handles.pic=pic; pic_gray=rgb2gray(pic); %转换为灰度图像 handles.pic_gray=pic_gray; pic_a=imadjust(pic_gray,[0,0.001],[1,0]); %明暗反转 pic_b=1.3*pic_gray+0.7*pic_a; pic_c=imadjust(pic_b,[0.5,1],[0,1]); %明暗反转 handles.pic_c=pic_c; pic_b_edge=edge(pic_c,'sobel'); %采用sobel算子进行边缘检测 handles.pic_b_edge=pic_b_edge; se=[1;1;1]; %线型结构元素 pic_imerode=imerode(pic_b_edge,se); %腐蚀图像 handles.pic_imerode=pic_imerode; se=strel('rectangle',[60,60]); %矩形结构元素 pic_imclose=imclose(pic_imerode,se); %图像聚类、填充图像 handles.pic_imclose=pic_imclose; pic_bwareaopen=bwareaopen(pic_imclose,10000); %去除聚团灰度值小于10000的部分 %%%%%求纸币行起始位置和终止位置%%%%% [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); 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