Zadaniem będzie napisanie programu wielowątkowego do przetwarzania i
wyświetlania obrazów.
Program główny najpierw uruchomi podproces wyświetlający obrazki
pobierane z pliku zmapowanego do pamięci, podobnie jak w poprzednim
zadaniu. Następnie program uruchomi kilka wątków, których zadaniem
będzie przetwarzanie obrazków określonym algorytmem filtracji (każdy
wątek będzie realizował inny filtr, patrz niżej). Potem wątek główny
będzie interakcyjnie pobierał od użytkownika nazwy plików kolejnych
obrazków, wczytywał je do pamięci, i zgłaszał gotowość kolejnego
obrazka, co dla wszystkich wątków będzie sygnałem do porzucenia
bieżących obliczeń i rozpoczęcia obróbki nowego obrazka.
Wątki filtrujące będą operowały na swoich własnych kopiach obrazka.
Po zakończeniu filtracji każdy wątek zgłosi gotowość swojej
przefiltrowanej wersji obrazka, i po otrzymaniu potwierdzenia
przekopiuje swój obrazek do globalnego obszaru pamięci zmapowanej do
pliku. Wątki filtrujące muszą być cały czas gotowe do przerwania
aktualnie wykonywanej pracy i rozpoczęcia jej od nowa na innym obrazku.
Dodatkowym wątkiem programu będzie wątek nadzorujący, który zapewni,
że kolejno zgłoszone jako przefiltrowane wersje obrazka będą w tej
kolejności wyświetlane przez uruchomiony w podprocesie program
wyświetlający (display), każdy przez określoną liczbę sekund. Czas
wyświetlania każdej wersji będzie zadany argumentem wywołania programu
(domyślnie 5 sekund). Wątek nadzorujący również musi zareagować na
wczytanie nowego obrazka przez wątek główny, i rozpocząć procedurę
sterowania jego wyświetlaniem.
Program powinien wyświetlać informację o tym, w jakiej kolejności
wątki zakończyły filtrowanie obrazka, i ile czasu trwały obliczenia
wszystkich filtrów.
Uwagi na temat przetwarzania obrazów. Do jego zaimplementowania można
wykorzystać bibliotekę graficzną taką jak OpenCV, Image Magick, albo
netpbm. Wtedy zarówno wczytywanie, filtrowanie, jak i zapis
przetworzonego obrazka w formacie do wyświetlania można wykonać w
całości gotowymi funkcjami biblioteki. Trzeba jednak zapoznać się z
daną biblioteką w stopniu wystarczającym do jej użycia.
W przypadku użycia tego typu biblioteki zaleca się użycie większej
liczby procedur filtrujących w celu zapoznania się z nimi.
Alternatywnym podejściem jest napisanie wszystkiego samodzielnie. W
takim przypadku proponowane jest wykorzystanie tylko plików w formacie
PNM (jest to podstawowy format biblioteki PNM) i implementację
filtracji w postaci konwolucji. W ten sposób jednym prostym
algorytmem można zrealizować kilka ciekawych filtracji, np. filtr
Sobela, wykrywanie krawędzi, różne rodzaje wygładzania, itp. (patrz
np. przykłady na stronie
http://wally.cs.iupui.edu/n351/raster/filterDemo.html).