Laboratorium 5 – Przetwarzanie obrazów 2
Zakres materiału
Struktury. Zmienne dynamiczne. Tablice dynamiczne. Argumenty wywołania programu. Asercje i obsługa błędów. Podział programu na moduły. Dokumentacja programu.
Przygotowanie do zajęć
Przed przystąpieniem do zajęć przygotuj następujące elementy oprogramowania:
- Z programu
Przetwarzanie obrazów 1
, zgodnie z metodologią
pokazaną na wykładzie, wydziel funkcje związane z obsługą obrazów i
utwórz z nich oddzielny moduł wraz z plikiem nagłówkowym –
zweryfikuj poprawność kompilacji i działania.
- Jeśli potrafisz, dla powyższego programu przygotuj plik makefile.
- Na podstawie powyższego pliku nagłówkowego utwórz plik nagłówkowy
dla zadania
Przetwarzanie obrazów 2
:
zdefiniuj strukturę danych, która będzie służyła do przechowywania informacji o obrazie
PGM, zaproponuj deklaracje funkcji (argumenty wywołania i zwracane wartości) dla funkcji
przetwarzania obrazów z wykorzystaniem zaproponowanej struktury i
napisz dokumentację zadeklarowanych funkcji.
Ponadto również:
- Zdefiniuj warunki asercji, jakie powinny być sprawdzane w każdej z funkcji.
- Przypomnij materiał z wykładu dotyczący argumentów wywołania programu
oraz alokowania i usuwania tablic o zadanym rozmiarze.
- Przeanalizuj funkcję przetwarzaj_opcje z dołączonego do zadania pliku opcje.c.
Zadanie do wykonania
Zmodyfikować program do przetwarzania obrazów z laboratorium 3 zgodnie z następującymi
założeniami:
- Wybrane elementy programu powinny tworzyć moduł z odpowiednim
plikiem nagłówkowym.
- Wprowadzić strukturę danych opisującą całościowo przechowywany w pamięci
obraz. Wykorzystać możliwość dynamicznego ustalania rozmiaru tablic, aby dopasować
rozmiar przechowywanych danych do rzeczywistych wymiarów obrazu. Zmodyfikować
funkcje programu tak, aby wykorzystywały wprowadzoną strukturę.
- Zmodyfikować dokumentację programu tak, by odpowiadała
wprowadzonym powyżej zmianom. Podobnie dokonywać modyfikacji
dokumentacji programu po zrealizowaniu każdego z poniżej podanych
punktów
- Uzupełnić funkcje o asercje sprawdzające zaproponowane warunki
poprawności.
- Dodać do programu obsługę obrazów kolorowych w formacie ppm (P3).
Funkcja wczytująca obraz powinna automatycznie rozpoznać typ pliku
i dostosować wielkość alokowanej pamięci, a struktura obrazu –
przechowywać informację z jakim obrazem mamy do czynienia.
- Zdefiniować funkcję konwersji do stopni szarości dla obrazów
kolorowych: każdy punkt nowego obrazu jest średnią arytmetyczną
wartości składowych kolorów. Przekonwertowany obraz powinien być
zapisywany w formacie PGM (opcjonalnie: do wyboru użytkownika PGM lub PPM).
- Zastąpić menu użytkownika, wykorzystując argumenty wywołania programu.
Program powinien rozpoznawać opcje wybrane z poniższych (wskazane przez prowadzącego):
- -i <nazwa_pliku> nazwa pliku do wczytania (jeśli zamiast nazwy podany
będzie znak '-' to zamiast z pliku obraz powinien być wczytywany ze standardowego
wejścia;
- -o <nazwa_pliku> nazwa pliku do zapisu (jeśli zamiast nazwy podany
będzie znak '-' to zamiast do pliku obraz powinien być wypisany na standardowym
wyjściu;
- -d obraz po przetworzeniu powinien zostać wyświetlony;
- -m <kolor> wybierz kolor do przetwarzania:
r – czerwony, g – zielony, b – niebieski, s
– konwersja do szarości
oraz dodatkowo wybrane opcje
związane ze zdefiniowanymi funkcjami przetwarzania obrazu:
- -n negatyw;
- -p <próg> progowanie z progiem o zadanej wartości procentowej.
- -pc <próg> progowanie czerni z progiem o zadanej wartości.
- -pb <próg> progowanie bieli z progiem o zadanej wartości.
- -g <współczynnik> korekcja gamma ze współczynnikiem o zadanej wartości.
- -z <czern> <biel> zmiana poziomów
- -k konturowanie;
- -rx rozmywanie poziome;
- -ry rozmywanie pionowe;
- -h rozciąganie histogramu;
- -s s12 s12 s13 s21 s22 s23 s31 s32 s33 splot;
Kolejność w jakiej mogą wystąpić opcje jest dowolna. Opcja
-i musi się pojawić przy wywołaniu programu. Jej brak, tak
jak i brak nazw plików po opcjach -i, -o oraz wartości progu
po -p powinny spowodować odpowiedni komunikat o błędzie. Brak
opcji -o oznacza wypisanie obrazu na standardowym wyjściu. W
programie można wykorzystać odpowiednio zmodyfikowaną funkcję z pliku
opcje.c.
Zadania dodatkowe (dla chętnych)
- Zmodyfikować program tak, by umożliwiał wykonanie ciągu wielu
operacji w zadanej kolejności.
- Zmodyfikować funkcję przetwarzaj_opcje tak, aby
korzystała z funkcji getopt zdefiniowanej w standardowym
pliku nagłówkowym unistd.h. Dokumentację można znaleźć na
http://man7.org/linux/man-pages/man3/getopt.3.html.
- Dodać możliwość wczytywania lub wczytywania i zapisu plików
JPG. Do tego celu można wykorzystać
bibliotekę libjpg wraz
załączonym tam przykładem.
- Wyposażyć program w możliwość równoczesnego operowania na więcej niż dwóch obrazach i funkcje do łączenia kilku obrazów (nakładanie, przenikanie, maskowanie).
- Wyposażyć program w interfejs typu powłoki, pozwalajacy na wydawanie poleceń operujących obrazami.
Przebieg ćwiczenia
Wydaje się, że najłatwiej można dokonać wymaganych zmian wprowadzając je jedną po drugiej w kolejności opisu w części Zadanie do wykonania.
Sprawozdanie
Sprawozdanie powinno zawierać:
- Imię i nazwisko autora, temat ćwiczenia, datę wykonania;
- Kod źródłowy programu;
- Testy programu (opis przebiegu z wynikami) w tym kolejno:
- Co dany test ma na celu;
- Metoda testowania - dane wejściowe;
- Dane wyjściowe zwrócone w teście przez program;
- Rezultat testu - ocena plus ewentualny komentarz;
- Wnioski końcowe.
Ponieważ w tym zadaniu program będzie składał się z kilku plików, jako plik sprawozdania można wykorzystać plik zawierający funkcję main programu. Pozostałe pliki należy dołączyć do sprawozdania tworząc archiwum poleceniem tar, w sposób pokazany poniżej
[john_doe@diablo:~]$ tar -cvf sprawozdanie5.tar makefile plik1.c plik2.c plik2.h itp
Tak utworzone archiwum jest plikiem binarnym, dlatego też, w celu przekazania go pocztą elektroniczną lub systemem studinfo, musi zostać zakodowane za pomocą znaków z podstawowego zakresu kodów ascii (kodowanie transportowe). Podczas gdy programy pocztowe takie kodowanie wykonują zazwyczaj automatycznie, dla systemu studinfo trzeba zrobić to samodzielnie poleceniem uuencode, w sposób pokazany poniżej
[john_doe@diablo:~]$ uuencode sprawozdanie5.tar sprawozdanie5.tar > sprawozdanie5.tar.uu
Czyności odwrotne do powyższych (dla chcących sprawdzić poprawność wykonanych poleceń) mają postać
[john_doe@diablo:~]$ uudecode sprawozdanie5.tar.uu
[john_doe@diablo:~]$ tar -xvf sprawozdanie5.tar
UWAGA! Jeśli lokalny katalog będzie zawierał pliki o nazwach identycznych z nazwami plików zawartych w archiwum, to zostaną one nadpisane. Także bezpiecznie jest przeprowadzić całą operację w jakimś katalogu tymczasowym, po skopiowaniu archiwum tamże.
Pytania kontrolne
-
Jak zdefiniować strukturę zawierającą obraz PGM, lub PPM?
-
Wskaż powód zamiany struktur do przechowywania informacji o obrazie
z zestawu zmiennych (przetwarzanie obrazów 1) na pojedynczą strukturę.
-
Jakie kroki należy wykonać, by móc korzystać z dynamicznej tablicy
dwuwymiarowej?
-
Jaka jest struktura zmiennej argv?
-
Omów sposób obsługi błędów w przykładowym programie opcje.c.
-
Czym są asercje? Jak powinna wyglądać asercja dla funkcji wczytującej obraz?
-
Jaka powinna być zawartość pliku nagłówkowego modułu?
-
W skład programu wchodzą następujące pliki: modul.c (z
definicjami funkcji eksportowanych) oraz main.c (z definicją funkcji
głównej i nagłówkami funkcji importowanych). Jak powinny wyglądać
poszczególne kroki kompilacji programu?