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:
Dưới ánh nắng mặt trời đang lên, những đống pallet nhựa An Giang trải dài mênh mông như những bức tranh tự nhiên đầy sắc màu. Mỗi chiếc pallet nhựa không chỉ là một vật dụng thông thường mà còn là...
Pallet nhựa An Giang giao hàng...