Đồ án Dò tìm và cắt ảnh mặt người dùng PCA
MỤC LỤC
Trang
Chương 1: GIỚI THIỆU MATLAB VÀ KHÁI QUÁT VỀ ẢNH
.1
1.1 Giới thiệu chung vềphần mềm Matlab.2
1.1.1 Khái niệm vềMatlab .2
1.1.2 Tổng quan vềcấu trúc dữliệu Matlab, các ứng dụng .2
1.1.2.1 Dữliệu.3
1.1.2.2 Ứng dụng.3
1.1.2.3 Toolbox là một công cụquan trọng trong Matlab .3
1.1.3 Hệthống Matlab .3
1.1.4 Làm quen với Matlab.4
1.1.5 Các cửa sổlàm việc của Matlab .5
1.2 Giới thiệu khái quát về ảnh số.7
1.2.1 Các khái niệm cơbản về ảnh.7
1.2.2 Các cách phân loại ảnh .8
1.3 Xửlý ảnh với Matlab .9
1.3.1 Xửlý ảnh .9
1.3.2 Các giai đoạn xửlý ảnh .10
1.3.3 Xửlý ảnh với Matlab.11
1.3.3.1 Các kiểu ảnh trong Matlab.11
1.3.3.2 Các hàm xửlý ảnh cơbản trong Matlab .13
1.3.3.3 Biến đổi không gian ảnh .20
Chương 2: CÁC PHƯƠNG PHÁP XÁC ĐỊNH KHUÔN MẶT
.36
2.1 Định nghĩa bài toán xác định khuôn mặt người.37
2.2 Ứng dụng của phương pháp xác định khuôn mặt .37
2.3 Phương pháp xác định khuôn mặt.39
2.3.1 Hướng tiếp cận dựa trên tri thức.40
2.3.2 Hướng tiếp cận dựa trên đặc trưng không thay đổi.41
2.3.2.1 Các đặc trưng khuôn mặt .42
2.3.2.2 Kết cấu .45
2.3.2.3 Sắc màu của da.45
2.3.2.4 Đa đặc trưng.45
2.3.3 Hướng tiếp cận dựa trên so khớp mẫu.45
2.3.4 Hướng tiếp cận dựa trên diện mạo .46
2.4 Khó khăn và thửthách trong bài toán xác định khuôn mặt người.47
Chương 3: PHÂN TÍCH THÀNH PHẦN CHÍNH PCA
(PRINCIPAL COMPONENT ANALYSIS)
.48
3.1 Sơlược vềphân tích thành phần chính PCA .49
3.2 Thuật toán PCA và ứng dụng trong nhận dạng khuôn mặt người .50
3.2.1 Thuật toán .50
3.2.2 Phân tích thành phần chính PCA .50
3.2.3 Hình ảnh minh họa .53
3.3 Ứng dụng Eigenfaces trong việc nhận dạng mặt người.56
3.3.1 Tính toán Eigenfaces .59
3.3.2 Dùng Eigenfaces đểphân loại ảnh mặt người.61
3.3.3 Ứng dụng Eigenfaces đểphát hiện gương mặt.62
3.3.3.1 Xem xét lại không gian mặt.63
3.3.3.2 Nhận dạng theo thời gian thực .64
3.4 Nhận xét .65
3.4.1 Ưu điểm của phương pháp PCA.65
3.4.2 Nhược điểm của PCA.65
Chương 4: CHƯƠNG TRÌNH MÔ PHỎNG
.67
4.1 Chương trình mô phỏng .68
4.1.1 Cơsởdữliệu ảnh.68
41.1.1 Tập ảnh huấn luyện.68
4.1.1.2 Tập ảnh mẫu.69
4.1.2 Các bước thực hiện chương trình .70
4.1.3 Lưu đồgiải thuật.72
4.1.3.1 Lưu đồgiải thuật chính .72
4.1.3.2 Lưu đồgiải thuật chi tiết.72
4.1.4 Kết quảmô phỏng.77
4.1.5 Tốc độthực hiện. .80
4.2 Nhận xét kết quả đạt được.81
Chương 5: KẾT LUẬN.85
5.1 Kết luận .85
5.2 Hướng phát triển đềtài.85
PHỤLỤC.
TÀI LIỆU THAM KHẢO .
q(j41-1,c1)=255;
anhkq(j4-2,c1)=255; anhkq(j41-2,c1)=255; anhkq(j4-3,c1)=255; anhkq(j41-3,c1)=255;
end
for d1=j4:j41
anhkq(d1,i4)=255; anhkq(d1,i41)=255; anhkq(d1,i4-1)=255; anhkq(d1,i41-1)=255;
anhkq(d1,i4-2)=255; anhkq(d1,i41-2)=255; anhkq(d1,i4-3)=255; anhkq(d1,i41-3)=255;
end
end
e=strcat('anhluu/anh_kq.jpg');
imwrite(anhkq,e);
****Đoạn code xác định vị trí trung tâm khuôn mặt*******
function [a1,b1]= do(anh,a,b)
% b la gia tri cot a la gia tri dong
mini=b; minj=a; maxj=a;
[d,c]=size(anh); b1=b-20; a1=a-15; a2=a+15;
if b1<1
b1=1;
end
if a1<1
a1=1;
end
if a2>d
a2=d;
end
for i1=b1:b
for j1=a1:a2
if anh(j1,i1)>200
Phụ lục
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu
Bùi Ngọc Liêm
if i1<mini
mini=i1;
end
if j1<minj
minj=j1;
end
if j1>maxj
maxj=j1;
end
end
end
end
a1=round((minj+maxj)/2); b1=round((mini+b)/2);
******Đoạn code nhận dạng Enginface***********
function kq=subim(anh,y,x)
[dong,cot]=size(anh); % hàm này có hai mục đích
d=27;c=18; % thứ 1: xóa bỏ các ảnh lỗi
i1=y-13;i2=y+13; % thứ hai biến đổi ảnh thành vector và làm tròn số
if i1<1 % trong thuật toán PCA xử lý ảnh theo khối do đó khi
i1=1; % cắt ảnh thì củng sẽ có những tấm ảnh bị lỗi
end % nên hàm này sẽ xóa tất cả các ảnh lỗi về giá trị
if i2>dong % chỉ giữ lại các ảnh có kích thước đúng với ảnh mẫu
i2=dong;
end
j1=x-8;j2=x+9;
if j1<1
j1=1;
end
if j2>cot
j2=cot;
end
im=anh(i1:i2,j1:j2);
kt=(i2-i1+1)*(j2-j1+1);
if kt==486
im=reshape(im',486,1);
kq=double(im);
else
im=reshape(im,kt,1);
kq=zeros(486,1);
for i=1:kt
kq(i,1)=im(i,1);
end
kq=double(kq);
end
*******Đoạn code nhận dạng và truy xuất thông tin cá nhân ảnh nhận
dạng********
******Đoạn code chương trình chính**********
anhtest=imread('anhluu/anhtest.jpg'); %đọc ảnh chọn để nhận dạng
if anhtest==255 % kiểm tra có phải là ảnh trắng hay không
axes(handles.axes3); % nếu là ảnh trắng thông tin nhận dạng sẽ là
imshow('hoso/0.jpg'); % tấm hình không nhận dạng được
set(handles.ten,'string','Khoâng bieát'); % và các thông tin khác đều “không biết”
set(handles.ns,'string','Khoâng bieát');
set(handles.mssv,'string','Khoâng bieát');
set(handles.lop,'string','Khoâng bieát');
set(handles.quequan,'string','Khoâng bieát');
Phụ lục
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu
Bùi Ngọc Liêm
else % nếu có tấm ảnh nhận dạng thì chương trình sẽ
anhtest=imresize(anhtest,[200 150]); % resize ảnh về đúng kích thước của ảnh mẫu
mau='anhmau'; %tạo cơ sở dữ liệu ảnh mẫu
T = taoCSDL1(mau); % tính giá trị eigenface của tập ảnh mẫu
[m, A, E] = taoEF1(T);
anhtim = nhandien1(anhtest, m, A, E); %gọi đến chương trình nhandien1 để nhận diện ảnh
anhtim1=anhtim+1;
% ******* Đọc và truy xuất dữ liệu của tấm ảnh nhận dạng được từ file Excel ************
file = [pwd '\hoso1.xls']; % khởi động chương trình Excel đọc file hoso1.xls
range = 'A2:E100';
h = actxserver('Excel.Application'); % chỉ khởi động nhưng không cho hiện lên bản Excel
h.Visible = 0; % Visible = 0 là ẩn Visible = 1 là cho nó hiện lên
workbook = h.Workbooks.Open( file );
Sheets = h.ActiveWorkBook.Sheets;
Sheets.Item(1).Activate;
s1=strcat('A',num2str(anhtim1)); % gọi ô nhớ chứa thông tin trong file EXCEL
s2=strcat('B',num2str(anhtim1));
s3=strcat('C',num2str(anhtim1));
s4=strcat('D',num2str(anhtim1));
s5=strcat('E',num2str(anhtim1));
h.Range(s1).Select; % Truy xuất thông tin cá nhân của tấm ảnh nhận
t1 = h.get('Selection').Value; % dạng trong flie Excel(hoso1. xls) theo đúng tên của
h.Range(s2).Select; % bức ảnh mẫu nhận dạng
t2 = h.get('Selection').Value;
h.Range(s3).Select;
t3 = h.get('Selection').Value;
h.Range(s4).Select;
t4 = h.get('Selection').Value;
h.Range(s5).Select;
t5 = h.get('Selection').Value;
set(handles.ten,'string',t1); %hiện thông tin cá nhân của tấm ảnh nhận dạng
set(handles.ns,'string',t2);
set(handles.mssv,'string',t3);
set(handles.lop,'string',t4);
set(handles.quequan,'string',t5);
axes(handles.axes3); % Hiện ảnh vừa nhận diện
imshow(strcat('hoso\',t3,'.jpg'));
workbook.Close(false); % Đóng và thoát chương trình Excel
h.Quit;
delete(h);
end
*******Đoạn code tạo cơ sở dữ liệu của chương trình nhận dạng*****
function T = taoCSDL1(mau)
csdl = dir(mau);
soanh = 0;
for i = 1:size(csdl,1)
if not(strcmp(csdl(i).name,'.')|strcmp(csdl(i).name,'..')|strcmp(csdl(i).name,'Thumbs.db'))
soanh = soanh + 1;
end
end
T = []; % tạo ma trận ảnh trong thư mục ảnh mẫu
for i = 1 : soanh
str = int2str(i);
str = strcat('\',str,'.jpg');
str = strcat(mau,str); % Lấy đầy đủ tên của bức ảnh
img = imread(str);
Phụ lục
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu
Bùi Ngọc Liêm
img = rgb2gray(img);
[dong cot] = size(img);
tam = reshape(img',dong*cot,1); % Biến ảnh thành vector
T = [T tam]; % Tăng dần kích thước ma trận ảnh T
end
*********Đoạn code tính Eigenface trung bình************
function [m, A, E] = taoEF1(T)
m = mean(T,2); %Tính toán giá trị ảnh trung bình
soanh = size(T,2);
%%%%%%%%%%%%%% Tính độ lệch của bức ảnh với gí trị trung bình của ảnh trung bình
A = [];
for i = 1 : soanh
temp = double(T(:,i)) - m; % T(:,i): vector cột thứ i chính là 1 bức
A = [A temp];
end
L = A'*A; % Tính ma trận A*A’
[V D] = eig(L); % tim các vector riêng và trị riêng
%V chứa những vector riêng, còn D chứa những trị riêng trong đó vector riêng V(:,i) ứng với trị riêng D(i,i)
D1=diag(D);
D1=sort(D1);
s=size(D1);s=s(1);
D1=D1(s-10);
LeigV = [];
for i = 1 : size(V,2)
if( D(i,i)>D1 )
LeigV = [LeigV V(:,i)];
end
end
E = A * LeigV;
sovector=size(E,2);
for i=1:sovector
dodai=norm(E(:,i));
E(:,i)=E(:,i)/dodai;
end
*****Đoạn code nhandien1 của chuong trình nhận dạng khuôn mặt*************
function anhtim = nhandien1(anhtest, m, A, E)
toado = []; %Tập tọa độ hình chiếu của các bức ảnh trong csdl
sovector = size(E,2); %số vector riêng trong E là số
for i = 1 : sovector
tam = E'*A(:,i); %tọa đô hình chiếu của bức ảnh Ai
toado = [toado tam];
end
tam = rgb2gray(anhtest); % chuyển ảnh màu thành ảnh trắng đen
[dong cot] = size(tam);
InImage = reshape(tam',dong*cot,1);
dolech = double(InImage)-m;
toadoKT = E'*dolech;
khoangcach = []; % tính khoảng cách của tấm ảnh so với các ảnh mẫu
for i = 1 : sovector % xác định khoảng cách ngắn nhất
q = toado(:,i);
tam = ( norm( toadoKT - q ) )^2;
khoangcach = [khoangcach tam];
Phụ lục
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu
Bùi Ngọc Liêm
end
[minKC , vitri] = min(khoangcach);
if minKC<50000000
anhtim=vitri;
elseif minKC>50000000
anhtim =100;
end
%%********Đoạn code liên quan*******%%
******* Đoạn code lưu ảnh*********
if s==255 % kiểm tra ảnh chọn lưu có phải là ảnh hay không
selection = questdlg(['No la anh trang do ban co luu khong?'],...
['Luu ' 'anh da chon!'],...
'Yes','No','Yes'); %Đưa ra bản thông báo nếu nó lá ảnh trắng
if strcmp(selection,'No') % chọn “No” để quay lại chương trình
return;
elseif strcmp(selection,'Yes')
[filename,pathname]=uiputfile({'*.jpg','JPEG Files(*.jpg)';...
'*.bmp','Bitmap Files(*.bmp)';'*.gif','GIF Files(*.gif)';...
'*.tif','TIFF Files(*.tif)';...
'*.*','all image file'},'Luu anh da chon!','anhkq/');
imwrite(s,[pathname,filename]);
end
else % nếu ảnh lưu không phải là ảnh trắng
[filename,pathname]=uiputfile({'*.jpg','JPEG Files(*.jpg)';...
'*.bmp','Bitmap Files(*.bmp)';'*.gif','GIF Files(*.gif)';...
'*.tif','TIFF Files(*.tif)';... %đặt tên và chọn loại ảnh muốn lưu
'*.*','all image file'},'Luu anh da chon!','anhkq/'); %thực hiện lưu ảnh
imwrite(s,[pathname,filename]);
end
********* Đoạn code chọn ảnh *******
[filename,pathname]=uigetfile({'*.jpeg;*.jpg;*.gif;*.tif;*.tiff;*.bmp;*.png',...
'all image file';'*.jpg;*.jpeg','JPEG Files(*.jpg,*.jpeg)';... % chọn đường dẫn nơi chứa ảnh test
'*.gif','GIF Files(*.gif)';'*.tif;*.tiff','TIFF Files(*.tif,*.tiff)';...
'*.bmp','Bitmap Files(*.bmp)';'*.png','PNG Files(*.png)'},'Chon anh kiem tra! ','anhtest/1.png');
anhchon=imread([pathname,filename]); % đọc ảnh đã chọn
axes(handles.axes1);
imshow(anhchon); % hiện ảnh chọn
a=strcat('anhluu/anh_goc.jpg');
imwrite(anhchon,a);
**********Đoạn code xóa ảnh ********
a=255; % tạo ra ảnh trắng
a1=strcat('anhluu/anh_goc.jpg'); imwrite(a,a1); % biến tát cả các ảnh đang hiện thành ảnh trắng
a1=strcat('anhluu/anh1.jpg'); imwrite(a,a1);
a1=strcat('anhluu/anh2.jpg'); imwrite(a,a1);
a1=strcat('anhluu/anh3.jpg'); imwrite(a,a1);
a1=strcat('anhluu/anh4.jpg'); imwrite(a,a1);
a1=strcat('anhluu/anh_face.jpg'); imwrite(a,a1);
a1=strcat('anhluu/anh_kq.jpg'); imwrite(a,a1);
a1=strcat('anhluu/anhtest.jpg'); imwrite(a,a1);
a1=255;
axes(handles.axes1); imshow(a1); % hiện ảnh trắng lên các ô ảnh
axes(handles.axes2); imshow(a1);
axes(handles.axes3); imshow(a1);
axes(handles.axes4); imshow(a1);
axes(handles.axes5); imshow(a1);
Phụ lục
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu
Bùi Ngọc Liêm
axes(handles.axes6); imshow(a1);
axes(handles.axes7); imshow(a1);
set(handles.ten,'string',' '); % xóa các dòng dữ liệu thông tin nhận dạng
set(handles.ns,'string',' ');
set(handles.mssv,'string',' ');
set(handles.lop,'string',' ');
set(handles.quequan,'string',' ');
******* Đoạn code thoát********
selection = questdlg(['Close ' get(handles.figure1,'Name') '?'],... % Đưa ra câu hỏi
['Close ' get(handles.figure1,'Name') '...'],...
'Yes','No','Yes'); % tạo bản lựu chọn có hai nút hỏi “Yes”, “No”
if strcmp(selection,'No') % nếu chọn “No” quay laị chương trình
return;
end % Nếu chọn Yes thoát khỏi chương trình
delete(handles.figure1)
File đính kèm:
Đồ án Dò tìm và cắt ảnh mặt người dùng PCA.pdf

