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