Przetwarzanie obrazu

Transkrypt

Przetwarzanie obrazu
Programowanie Obiektowe C++ INP002010L dr inż. Sebastian Kraszewski Laboratorium 9
Na koniec zajęć wysyłamy pliki z wykonanymi ćwiczeniami na adres
[email protected]. Pliki NALEŻY nazywać w następujący sposób:
imię_nazwisko_nrindexu_zadanieX.cpp a w tytule maila podać: Imię i Nazwisko. Proszę
nie opuszczać sali laboratoryjnej zanim prowadzący nie potwierdzi otrzymania maila z
zadaniami. W przypadku nie otrzymania maila przez prowadzącego z jakichkolwiek
przyczyn obecność na zajęciach nie zostanie uznana. Zadania punktowane wykonujemy na
zajęciach lub w domu i wysyłamy najpóźniej do 10min PRZED następnymi zajęciami
(tydzień na wykonanie zadania). Przetwarzanie obrazu OpenCV posiada szereg funkcji umożliwiających przetwarzanie obrazu. Stwórzmy dwie zmienne przechowujące obrazy. Do jednej załadujemy obraz zapisany na dysku. Druga będzie przechowywać efekt naszych zabiegów. Kod poniżej przedstawia użycie wybranych funkcji służących do tzw. rozmycia obrazu (z ang. blur) stosując różne algorytmy przetwarzania obrazu: O wszystkich możesz poczytać tutaj: (http://docs.opencv.org/modules/imgproc/doc/filtering.html). Pierwszymi dwiema zmiennymi każdej z tych funkcji są oczywiście zmienne przechowujące kolejno obraz przed i po modyfikacji. Na szczególną uwagę zasługuje trzecia zmienna, która opisuje rozmiary okna wykorzystywanego przez te funkcje do filtracji obrazu. Prześledź wpływ wielkości okna na uzyskiwany efekt. Innymi, często wykorzystywanymi zabiegami stosowanymi w przetwarzaniu obrazu są dylatacja i erozja. Poniżej przedstawiono przykład ich użycia w OpenCV: Strona 1 z 3 Programowanie Obiektowe C++ INP002010L dr inż. Sebastian Kraszewski Użycie tych funkcji wymaga zdefiniowania wcześniej osobnej zmiennej typu Mat, która mówi o rozmiarze okna przetwarzania obrazu: Prześledź wpływ wielkości okna na uzyskiwany efekt. Najpopularniejszymi cechami opisującymi obraz są jasność i kontrast. W OpenCV zmianę tych parametrów można zrealizować na dwa sposoby (przynajmniej). W zrozumieniu ich działania przydatna jest wiedza na temat funkcji opisującej transformację pojedynczego pixela: gdzie: f(i,j) – jeden pixel obrazu α – zwykle nazywane wzmocnieniem, tutaj jest to po prostu kontrast β – zwykle nazywany zaburzeniem, tutaj jest to po prostu jasność Poniższy kod przedstawia jak iterując po wszystkich pixelach obrazu (i wszystkich składowych koloru pixela) ręcznie zmieniać wartość kontrastu i jasności obrazu: Niestety, gdy obraz jest duży, iteracja po wszystkich jego pixelach zajmuje pewien okres czasu. Obraz można jednak przeskalować do wybranej przez siebie wielkości. Poniższy kod pokazuje jak Strona 2 z 3 Programowanie Obiektowe C++ INP002010L dr inż. Sebastian Kraszewski dowolny obraz przeskalować proporcjonalnie do obrazu wyjściowego, który nie przekracza 500 pixeli szerokości (wzdłuż osi X): Zmienna dsize mówi nam po prostu o wielkości obrazu wyjściowego. Istnieje jednak szybsza funkcja, która może posłużyć do zmiany jasności i kontrastu obrazu. Jej użycie zaprezentowano poniżej: Prześledź wpływ parametrów alpha i beta, oraz brightness i contrast na uzyskiwany efekt. ZADANIA PUNKTOWANE (1 zadanie):
Zadanie do oddania do następnych zajęć (3 pkt) Stwórz pisemny raport opisujący w jaki sposób zmieni się
jakość wykrywania twarzy przy zachowaniu tych samych parametrów funkcji detectMultiScale(...) (na
podstawie tego samego obrazka grupy ludzi, którego użyłaś/użyłeś do wykonania zadania z listy 8) po
przetworzeniu obrazu algorytmem blur, GaussianBlur, medianBlur, (brightness=20, contrast=-20),
(brightness=80, contrast=10). Jako potwierdzenie wyników wklej do raportu nieprzetworzony obraz z
wykrywaniem twarzy oraz 5 wynikowych, przetworzonych obrazów.
Strona 3 z 3