Biến đổi Fourier rời rạc(DFT) trong nhận diện mặt người sử dụng Matlab
Bài đăng này đã không được cập nhật trong 3 năm
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).
1. Về phép biến đổi Fourier
- 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. Biến đổi Fourier rời rạc
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. Thực hiện biến đồi Fourier trong Matlab
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ả
All rights reserved