【圖像識別】基于模板匹配算法識別人臉matlab源碼含GUI
一、簡介
應(yīng)用統(tǒng)計方法解決模式識別問題時,一再碰到的問題之一就是維數(shù)問題。在低維空間里解析上或計算上行得通的方法,在高維空間里往往行不通。因此,降低維數(shù)有時就會成為處理實(shí)際問題的關(guān)鍵。
1 問題描述:如何根據(jù)實(shí)際情況找到一條最好的、最易于分類的投影線,這就是Fisher判別方法所要解決的基本問題。
考慮把d維空間的樣本投影到一條直線上,形成一維空間,即把維數(shù)壓縮到一維。然而,即使樣本在d維空間里形成若干緊湊的互相分得開的集群,當(dāng)把它們投影到一條直線上時,也可能會是幾類樣本混在一起而變得無法識別。但是,在一般情況下,總可以找到某個方向,使在這個方向的直線上,樣本的投影能分得開。下圖可能會更加直觀一點(diǎn):


類效果。因此,上述尋找最佳投影方向的問題,在數(shù)學(xué)上就是尋找最好的變換向量w*的問題。
2 Fisher準(zhǔn)則函數(shù)的定義
幾個必要的基本參量:
2.1在d維X空間
(1)各類樣本的均值向量mi

(2)樣本類內(nèi)離散度矩陣Si和總樣本類內(nèi)離散度矩陣Sw

其中Sw是對稱半正定矩陣,而且當(dāng)N>d時通常是非奇異的。(半正定矩陣:特征值都不小于零的實(shí)對稱矩陣;非奇異矩陣:矩陣的行列式不為零)
(3)樣本類間離散度矩陣Sb

Sb是對稱半正定矩陣。
3.2 在一維Y空間
(1)各類樣本的均值

(2)樣本類內(nèi)離散度 和總樣本類內(nèi)離散度

我們希望投影后,在一維Y空間中各類樣本盡可能分得開些,即希望兩類均值之差越大越好,同時希望各類樣本內(nèi)部盡量密集,即希望類內(nèi)離散度越小越好。
Fisher準(zhǔn)則函數(shù)定義


因此,

將上述各式代入JF(w),可得:

其中Sb為樣本類間離散度矩陣,Sw為總樣本類內(nèi)離散度矩陣。
4 最佳變換向量w*的求取


二、源代碼
function varargout = faceCore(varargin)
% FACECORE M-file for faceCore.fig
% ? ? ?FACECORE, by itself, creates a new FACECORE or raises the existing
% ? ? ?singleton*.
%
% ? ? ?H = FACECORE returns the handle to a new FACECORE or the handle to
% ? ? ?the existing singleton*.
%
% ? ? ?FACECORE('CALLBACK',hObject,eventData,handles,...) calls the local
% ? ? ?function named CALLBACK in FACECORE.M with the given input arguments.
%
% ? ? ?FACECORE('Property','Value',...) creates a new FACECORE or raises the
% ? ? ?existing singleton*. ?Starting from the left, property value pairs are
% ? ? ?applied to the GUI before faceCore_OpeningFunction gets called. ?An
% ? ? ?unrecognized property name or invalid value makes property application
% ? ? ?stop. ?All inputs are passed to faceCore_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
% Copyright 2002-2003 The MathWorks, Inc.
% Edit the above text to modify the response to help faceCore
% Last Modified by GUIDE v2.5 28-May-2009 10:21:26
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', ? ? ? mfilename, ...
? ? ? ? ? ? ? ? ? 'gui_Singleton', ?gui_Singleton, ...
? ? ? ? ? ? ? ? ? 'gui_OpeningFcn', @faceCore_OpeningFcn, ...
? ? ? ? ? ? ? ? ? 'gui_OutputFcn', ?@faceCore_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 faceCore is made visible.
function faceCore_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 faceCore (see VARARGIN)
% Choose default command line output for faceCore
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes faceCore wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = faceCore_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)
global TrainDatabasePath ;
TrainDatabasePath = uigetdir(strcat(matlabroot,'\work'), '訓(xùn)練庫路徑選擇...' );
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject ? ?handle to pushbutton2 (see GCBO)
% eventdata ?reserved - to be defined in a future version of MATLAB
% handles ? ?structure with handles and user data (see GUIDATA)
global TestDatabasePath;
TestDatabasePath = uigetdir(strcat(matlabroot,'\work'), '測試庫路徑選擇...');
% --- Executes on button press in pushbutton3.
%function pushbutton3_Callback(hObject, eventdata, handles)
% hObject ? ?handle to pushbutton3 (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';'*.bmp'},'');
%str=[pathname ?filename];
%im=imread(str);
%axes(handles.axes1);
%imshow(im);
% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject ? ?handle to pushbutton4 (see GCBO)
% eventdata ?reserved - to be defined in a future version of MATLAB
% handles ? ?structure with handles and user data (see GUIDATA)
global TrainDatabasePath ;
global TestDatabasePath;
global T;
T = CreateDatabase(TrainDatabasePath);
%[m V_PCA V_Fisher ProjectedImages_Fisher] = FisherfaceCore(T);
% --- Executes on button press in pushbutton5.
function pushbutton9_Callback(hObject, eventdata, handles)
% hObject ? ?handle to pushbutton5 (see GCBO)
% eventdata ?reserved - to be defined in a future version of MATLAB
% handles ? ?structure with handles and user data (see GUIDATA)
global im;
[filename,pathname]=uigetfile({'*.jpg';'*.bmp'},'選擇測試圖片...');
str=[pathname ?filename];
im=imread(str);
axes(handles.axes1);
imshow(im);
function OutputName = Recognition(TestImage, m_database, V_PCA, V_Fisher, ProjectedImages_Fisher)
% Recognizing step....
%
% Description: This function compares two faces by projecting the images into facespace and
% measuring the Euclidean distance between them.
%
% Argument: ? ? ?TestImage ? ? ? ? ? ? ?- Path of the input test image
%
% ? ? ? ? ? ? ? ?m_database ? ? ? ? ? ? - (M*Nx1) Mean of the training database
% ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? database, which is output of 'EigenfaceCore' function.
%
% ? ? ? ? ? ? ? ?V_PCA ? ? ? ? ? ? ? ? ?- (M*Nx(P-1)) Eigen vectors of the covariance matrix of
% ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? the training database
% ? ? ? ? ? ? ? ?V_Fisher ? ? ? ? ? ? ? - ((P-1)x(C-1)) Largest (C-1) eigen vectors of matrix J = inv(Sw) * Sb
% ? ? ? ? ? ? ? ?ProjectedImages_Fisher - ((C-1)xP) Training images, which
% ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? are projected onto Fisher linear space
%
% Returns: ? ? ? OutputName ? ? ? ? ? ? - Name of the recognized image in the training database.
%
% See also: RESHAPE, STRCAT
% Original version by Amir Hossein Omidvarnia, October 2007
% ? ? ? ? ? ? ? ? ? ? Email: aomidvar@ece.ut.ac.ir ? ? ? ? ? ? ? ? ?
Train_Number = size(ProjectedImages_Fisher,2);
%%%%%%%%%%%%%%%%%%%%%%%% Extracting the FLD features from test image
%InputImage = imread(TestImage);
temp=TestImage(:,:,1);
%temp = InputImage(:,:,1);
[irow icol] = size(temp);
InImage = reshape(temp',irow*icol,1);
Difference = double(InImage)-m_database; % Centered test image
ProjectedTestImage = V_Fisher' * V_PCA' * Difference; % Test image feature vector
三、運(yùn)行結(jié)果



?