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).

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