Lab03 - Rozpoznawanie twarzy po owalu
Transkrypt
Lab03 - Rozpoznawanie twarzy po owalu
Politechnika Szczecińska - Wydział Informatyki Techniki biometryczne Sprawozdanie nr 2 Paweł Najgebauer Rok akademicki: 2007/2008 Semestr: I Temat: Rozpoznawanie twarzy po owalu Grupa ćw.: IU11 Grupa lab.: 2 Data: 2.12.2007 Ocena: Opis algorytmu działania Obrazek po wczytaniu jest skalowany pionowo do 75 % oryginalnego rozmiaru w celu zbliżeniu kształtu twarzy do okręgu. Następnie w celu łatwiejszego wykrycia krawędzi jest zmieniany w skalę szarości. Dokonujemy transformaty Fouriera, wycinamy środek widma oraz odwrotną transformatę Fouriera. Następnie na podstawie wykrytych krawędzi tworzona jest ‘macierz centrów twarzy’ i ustalany jest środek okręgu. function result = lab3(img_path) radius = 15; circleRadius = 80; %wczytanie i zmiana wielkosci obrazka img = imread(img_path, 'JPG'); [x y z] = size(img); img_resize = imresize(img, [0.75*x y]); [resizeX resizeY resizeZ] = size(img_resize); %przekształcenie obrazka na skale szarosci img_gray = double(.2989*img_resize(:,:,1) + .5870*img_resize(:,:,2) +.1140*img_resize(:,:,3)); maxX = max(max(img_gray)); img_gray = img_gray/maxX; spectrum = fftshift(fft2(img_gray)); [speX speY] = size(spectrum); halfSpeX = speX / 2; halfSpeY = speY / 2; %wyciecie ze spktrum srodka o promieniu radius for i = 1:speX for j = 1:speY if ~((i > (halfSpeX - radius)) & (i < (halfSpeX + radius)) & (j > (halfSpeY -radius)) & (j < (halfSpeY + radius))) spectrum(i, j) = 0; end end end spectrumR = round(abs(ifft2(spectrum))); %wypelnieine Macierzy Centrow Twarzy (mct) mct = zeros(resizeX, resizeY); circleRadius = circleRadius^2; for i=1:speX-1 for j=1:speY-1 if spectrumR(i,j) ~= spectrumR(i,j+1) || spectrumR(i,j) ~= spectrumR(i+1,j) for k=1:resizeX for l=1:resizeY if (((k-i)^2 + (l-j)^2) < circleRadius) mct(k,l) = mct(k,l) + 1; end; end; end; end; end; end; %znalezienie najwiekszej wartosci w mct [iMax,jMax] = find(mct==(max(max(mct))),1); %rysowanie ramki twarzy for i=1:resizeX for j=1:resizeY if abs(((i-iMax)^2 + (j-jMax)^2) - circleRadius) <= 200 img_resize(i,j,:) = 0; end; end; end; result = imresize(img_resize,[x y]); image(result); Wyniki programu: radius = 15; circleRadius = 65; radius = 9; circleRadius = 80; radius = 15; circleRadius = 65; radius = 15; circleRadius = 60; radius = 15; circleRadius = 75; Wnioski Na podstawie wyników można stwierdzić, że rozpoznawanie tą metodą jest skuteczne. Udało się rozpoznać i prawidłowo zaznaczyć twarz nawet na zdjęciach, na których poprzednia metoda rozpoznawania po kolorach nie dała prawidłowych wyników. Jedynym problemem jest koniczeczność dostosowywania promienia owalu wyznaczającego twarz, ale problem ten można obejść stosując standardową skalę i proporcje zdjęcia.