Lab02 - Rozpoznawanie twarzy na podstawie barwy

Transkrypt

Lab02 - Rozpoznawanie twarzy na podstawie barwy
Politechnika Szczecińska - Wydział Informatyki
Techniki biometryczne
Sprawozdanie nr 1
Paweł Najgebauer
Rok akademicki: 2007/2008
Semestr: I
Temat: Rozpoznawanie twarzy na podstawie barwy
Grupa ćw.: IU11
Data: 10.11.2007
Grupa lab.: 2
Ocena:
Program wykorzystuje cechę charakterystyczną barwy skóry ludzkiej.
Twarz na zdjęciu w formacie HSV można rozpoznać, ponieważ spełnia
następujące warunki
H ≥ 0,9 lub H ≤ 0,1
S ≥ 0,2 i S ≤ 0,6
V ≥ 0,4
Aby rozpoznać twarz należy przekształcić zdjęcie do formatu HSV.
Następnie stworzyć maski spełniające warunki odpowiednio dla wartości
częstotliwości, nasycenia koloru, mocy światła. Iloczyn poszczególnych
masek tworzy nam część wspólną, czyli prawdopodobnie obszar zdjęcia na
którym znajduje się twarz. W celu usunięciu szumów ze zdjęcia, stosuję się
transformatę Fouriera oraz odwrotną transformatę Fouriera. Ostatnim
etapem jest obrysowanie wykrytego obszaru ramką.
function image = lab02(image_path)
image = imread(image_path, 'JPG');
% zamiana z RGB na HSV
imageHSV = rgb2hsv(image);
% wykrywanie twarzy
[x y z] = size(imageHSV);
maska1 = zeros(x, y);
maska2 = zeros(x, y);
maska3 = zeros(x, y);
maska1(find(imageHSV(:, :, 1) >= 0.9 | imageHSV(:, :, 1) <= 0.1)) = 1;
maska2(find(imageHSV(:, :, 2) >= 0.2 & imageHSV(:, :, 2) <= 0.6)) = 1;
maska3(find(imageHSV(:, :, 3) >= 0.4)) = 1;
%usuniecie szumow przy pomocy transformaty i odwrotnosci transformaty
%Fouriera
spectrum = fftshift(fft2(maska1 .* maska2 .* maska3));
[a b] = size(spectrum);
for i = 1:a
for j = 1:b
if(~((i > (a/2 - 3)) & (i < (a/2 + 3)) & (j > (b/2 - 3)) & (j < (b/2 + 3))))
spectrum(i, j) = 0;
end
end
end
spectrumR = round(ifft2(spectrum));
%znalezienie UpLeft i DownRight rogow twarzy
UL = [x y];
DR = [1 1];
for i = 1:x
for j = 1:y
if(spectrumR(i, j) ~= 0)
if(i > DR(1,1))
DR(1,1) = i;
else
if(i < UL(1,1))
UL(1,1) = i;
end
end
if(j > DR(1,2))
DR(1,2) = j;
else
if(j < UL(1,2))
UL(1,2) = j;
end
end
end
end
end
%rysowanie ramki twarzy
image(UL(1,1),UL(1,2):DR(1,2),:) = 1;
image(UL(1,1):DR(1,1),DR(1,2),:) = 1;
image(DR(1,1),UL(1,2):DR(1,2),:) = 1;
image(UL(1,1):DR(1,1),UL(1,2),:) = 1;
imagesc(image);
Wyniki programu:
Wnioski
Na podstawie działania programu można stwierdzić, że bardzo duże
znaczenie w procesie rozpoznawania ma oświetlenie oraz tło robionego
zdjęcia. Należy zwrócić uwagę na ostanie zdjęcie, na którym twarz została
rozpoznana na plakacie będącym tłem.
Metoda dobrze się sprawdza na
zdjęciach dobrej jakości dostosowanych w tym celu.