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.