Đồ á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 .

pdf115 trang | Chuyên mục: MATLAB | Chia sẻ: dkS00TYs | Lượt xem: 2767 | Lượt tải: 1download
Tóm tắt nội dung Đồ án Dò tìm và cắt ảnh mặt người dùng PCA, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
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:

  • pdfĐồ án Dò tìm và cắt ảnh mặt người dùng PCA.pdf