Tớ vừa làm bài tập lớn môn xử lý ảnh,dùng PCA để nhận dạng ảnh,ảnh ở đây chỉ là các chữ số từ 0-9,các bạn muốn dùng để nhận dạng khuôn mặt hay chữ cái cũng được.
Lý thuyết của PCA :
Mỗi ảnh có kích thước là M*N
Giả sử tập huấn luyện có P ảnh , khi đó ta sẽ có P vector : T1 , T2 , … , TP .
Tìm vecto ảnh trung bình m
So sánh các ảnh khác so với giá trị trung bình m
A_i= Ti- m , i=1…P
Đặc trưng của các hình chính là các vecto riêng và các trị riêng.Vì mỗi ma trận ảnh có 1 phương trình đặc trưng,nhận pi làm trị riêng.Lúc đó sẽ tồn tại vecto riêng u khác 0 sao cho
A*u = A*pi.
Ta cần tìm ra các vecto riêng của ma trận từ các trị riêng tìm được.
Các vecto riêng và trị riêng từ ma trận A * A^T
Ta thấy ma trận A có kích thước M*N × P , còn ma trận A*A^T có kích thước M*N×M*N
Đặt L=A^T * A , tìm V là tập hợp các vector riêng của L , D là tập hợp các trị riêng tương ứng
Ta chỉ cần lấy 1 lượng đặc trưng nhất định.Tức là chỉ cần lấy n vecto riêng là đủ để có thể lấy đặc trưng cho không gian chữ số.
E là ma trận M*N×n , mỗi cột là một vector riêng .
Từ tập các vecto riêng ta xây dựng 1 cơ sở trực chuẩn cho không gian chứa chữ số.Các tập vecto trực chuẩn này sẽ mô tả 1 cách tốt nhất sự phân bố các vecto trong không gian chữ số.Từ đó nhận ra đặc trưng riêng biệt của mỗi chữ số.
Bước so sánh :
Chiếu hình cần tìm lên trên không gian chữ số.Để làm được điều này cần có cơ sở trực chuẩn đã lấy được từ trên:
Lý thuyết :
Cho V là một không gian có tích vô hướng hữu hạn chiều và W là một không gian con của V . Giả sử W có một cơ sở trực chuần là {u_1, … , u_Q} .
TIếp tục chiếu ảnh kiểm tra lên từng ảnh trong tập huấn luyện
Khoảng cách gần nhất giữa 2 kết quả trên chính là 2 ảnh giống nhau nhất
Xây dựng bằng mã giả :
Mã:
while(!end_of_path) // vào thư mục traning A = openfile(file_current,r) // lấy tên file hiện tại file_next(); // trỏ vào file tiếp // Bien tat ca anh kich thuoc MxN thanh vector cot M*Nx1 ANH[m,n] = chuyen_anh_thanh_matran(A); // chuyển từ ảnh có kích thước mxn thành ma trận mxn ANH[m,n] = chuyen_thanh_anh_gray_scarle(); // chuyển thành ảnh trắng đen T[M,N,P] = T[size_witch,size_height,A]; //T là một ma trận có kích thước M*NxP chứa tất cả ảnh trong csdl , mỗi ảnh là // một vecto cột. // tìm m là giá trị trung bình của các ảnh // Sau đó lấy từng bức ảnh trong T trừ đi bức ảnh trung bình ta được ma trận A có // kich thuoc M*NxP m = trungbinh(T,2); soanh = size(T,2); // tính độ lệch của mỗi hình huấn luyện với ảnh trung bình A = []; for i = 1 : soanh temp = (T(size(A),i)) - m A[M*N*P] = temp; end // Ta tìm Eigenvecto(các vecto riêng ) của ma trận A*A' , nhưng ma // trận A*A' có kích thước là M*NxM*N quá lớn , ta sẽ tìm các vecto riêng // của ma trận A'*A có kích thước PxP L = A'*A; [V D] = eigen(L); // hàm eigen để lấy các vecto riêng và trị riêng từ L //V chứa các vecto riêng còn D chứa các trị riêng //vecto rieng V(M*N,i) ung voi tri rieng D(i,i) D1=sort_giamdan(D); // sắp xếp giảm dần tập các vecto riêng D1=D1[size(D)-20]; // lấy ra 20 vecto riêng : lấy bao nhiêu tùy ý,nhưng 20 có lẽ là //đủ các đặc trưng cần thiết D1 chính là tập 20 vecto riêng /hu da noi o tren , sau khi co cac vector rieng cua ma tran A'*A , ta tim //cac vector rieng cua ma tran A*A' bang cach lay ma tran A nhan voi D1 //Từ đó ta có tập các vecto riêng đặc trưng cho không gian ma trận A*A' là E E = A * D1; //Nhưng E chỉ là 1 tập các vecto trực giao,nên ta cần chuẩn hóa nó để tạo thành //1 cơ sở trực chuẩn,phục vụ cho phép chiếu về sau. E=chuyen_ve_co_so_truc_chuan(E); endwhile //thực hiện các phép chiếu :// với//E là tập các vecto trực chuẩn,A là độ lệch giữa ảnh đang xét và m(giá trị trung bình)//tìm tọa độ của các ảnh huấn luyện khi chiếu lên không gian chữ số sovector = size(E);//so vector rieng trong E ( la so cot )for k=1 to tongsoanh do: for i = 1 to sovector do : I += E*A(i); //tọa độ hình chiếu I của bức ảnh thứ k endfortoado[k] = I; // lưu các tọa độ hình chiếu của các bức ảnh lên không gian chữ sốendfor // tìm tọa độ của ảnh cần kiểm tra chiếu lên không gian chữ số//làm tượng tự nnhư với các ảnh trong tập huấn luyện. for i = 1 to sovector do : toado_anh_kiemtra += E*A(i); //tọa độ hình chiếu của ảnh kiểm traendfor //so sánh khoảng cách giữa tọa độ ảnh kiểm tra và các ảnh huấn luyện// các hình chiếu lên không gian chữ số là các vecto,vì thế để tính khoảng cách//ta sẽ dùng công thức tính khoảng cách euclipse// khoảng cách từng hình 1 sẽ lưu vào mảng khoangcach khoangcach = [];for k = 1 to tongsoanh do : for i = 1 to sovector do : q = toado(m,n,i); h = (lay_truchuan(toado_anh_kiemtra - q ) )^2; endkhoangcach[k] = h; // sắp xếp trong mảng khoangcach -> có thể dùng knn để quyết định min = sort_tangdan(khoangcach[],tosoanh); //min là vị trí của bức ảnh trong tập huấn luyện có tọa độ chiếu so với tọa độ chiếu của ảnh kiểm tra/hỏ nhất//từ đó có thể đưa ra quyết định
Source đính kèm viết trên VS2008 bằng C++ WinAPI
View more random threads:
Vừa qua, Chính phủ đã ban hành Quyết định số 2383/QĐ-TTg ngày 09/12/2013 về việc xếp hạng di tích quốc gia đặc biệt. Theo đó, khu di tích Đường Trường Sơn - Đường Hồ Chí Minh là 1 trong 14 kỷ vật...
Các relic, danh thắng được xếp...