Biến đổi Fourier rời rạc(DFT) trong nhận diện mặt người sử dụng Matlab
Mình đã từng sử dụng Matlab trong việc nhận diện mặt người sử dụng nhiều kỹ thuật khác nhau như biến đổi Fourier rời rạc, Cosine rời rạc và Wavelet. Hôm nay, mình sẽ giới thiệu về phương pháp đầu tiên: Sử dụng biến đổi Fourier rời rạc (DFT). Về mặt toán học: Biến đổi Fourier là phép toán ...
Mình đã từng sử dụng Matlab trong việc nhận diện mặt người sử dụng nhiều kỹ thuật khác nhau như biến đổi Fourier rời rạc, Cosine rời rạc và Wavelet. Hôm nay, mình sẽ giới thiệu về phương pháp đầu tiên: Sử dụng biến đổi Fourier rời rạc (DFT).
- Về mặt toán học: Biến đổi Fourier là phép toán chuyển một hàm với giá trị phức của các biến thành hàm khác.
- Trong xử lý tín hiệu số để hiểu được định nghĩa của Fourier cần biết được 2 khái niệm:
- Miền thời gian: Là miền xác định của hàm dựa theo thời gian
- Miền tần số: Là miền mới của tín hiệu dựa trên tần số sau việc chuyển đổi tín hiệu từ miền thời gian Biến đổi Fourier là việc biến đổi tín hiệu từ miền thời gian sang miền tần số. Biến đổi Fourier đóng vai trò quan trọng trong xử lý ảnh, có khả năng linh hoạt cao trong thiết kế và tiến hành các phương pháp lọc trong việc nâng cao chất lượng ảnh, phục hồi ảnh, nén ảnh…
2.1. Công thức biến đổi Fourier rời rạc (DFT) 2.2. Công thức biến đổi Fourier rời rạc ngược (IDFT)
3.1. Ý tưởng
- Bước 1: Sử dụng Fourier để biến đổi ảnh về miền tần số
- Bước 2: Từ ảnh training, chọn ra các vector đặc trưng của ảnh
- Bước 3: Chọn những thuộc tính đặc trưng nhất từ vector đặc trưng
- Bước 4: Tìm kiếm ảnh gần giống nhất với ảnh cần tìm
3.2. Hiện thực hóa
3.2.1. Hàm Fourier (DFT) - Hàm dft để chuyển đổi một bức ảnh bằng phương pháp chuyển đổi Fourier rời rạc (DFT) để rời rạc hóa ảnh nhằm trích xuất ra được vector đặc trưng của ảnh.
function [Xk] = dft(xn) N = length(xn); n = 0:1:N-1; % row vector for n k = 0:1:N-1; % row vecor for k WN = exp(-j*2*pi/N); % Twiddle factor (w) nk = n'*k; % creates a N by N matrix of nk values WNnk = WN .^ nk; % DFT matrix Xk = WNnk*xn; end
- Trích chọn đặc trưng
function out = dft2(x) y = zeros(size(x)); y1 = y; C = size(x,2); %number of columns for c = 1:C y(:,c) = dft(x(:,c)); end R = size(x,1); %number of rows for r = 1:R y1(r,:) = dft(y(r,:).'); end out = y1; end
3.2.2. Tìm ảnh giống
function [ATT] = similar(S) if size(S,3) == 3 S1= rgb2gray(S); end I = im2double(S1); T = dft(8); B = blkproc(I,[8 8],'P1*x*P2',T,T); mask = [1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]; B2 = blkproc(B,[8 8],'P1.*x',mask); %imshow(B2); I2 = blkproc(B2,[8 8],'P1*x*P2',T,T); I2 = I2/255; [m, n] = size(B2); d = 1; for ( i = 1:8:m) for( j = 1:8:n) ATT(d) = round(B2(i,j)); d = d+1; end end end
3.2.3. Hàm bắt sự kiện trong Matlab 3.2.3.1. Sự kiện chọn ảnh
function btnChon_Callback(hObject, eventdata, handles) % hObject handle to btnChon (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) [filename, path] = uigetfile({'*.*'}); %Infor = imfinfor(fullfile(path, filename)); %lấy thông tin ảnh Img = imread(fullfile(path, filename)); %chọn ảnh %hiển thị ảnh trên axes1 %imshow(Img) %trich vector dac trung global AT AT = similar(Img); axes(handles.axes1) imshow(Img)
3.2.3.2. Sự kiện tìm kiếm ảnh giống
function btnSearch_Callback(hObject, eventdata, handles) % hObject handle to btnSearch (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global AT file = dir('*.jpg'); N = length(file); for (k = 1:N) sim(k) = 0; end for (k = 1:N) filename = file(k).name; Pic = imread(filename); ATT= similar(Pic); t1 = min(length(AT),length(ATT)); t2 = max(length(AT),length(ATT)); for(i =1:t1) sim(k) = sim(k)+abs(AT(1,i)-ATT(1,i)); end for(i = (t1+1):t2) if(length(AT) > length(ATT)) sim(k) = sim(k) + AT(1,i); else sim(k) = sim(k) + ATT(1,i); end end Mi = sim(1); for (i = 2:N) Mi = min(Mi, sim(i)); end for (i = 1:N) if (Mi == sim(i)) Pic = imread(file(i).name); axes(handles.axes2) imshow(Pic) break end end end
3.3. Kết quả