Do prostych operacji, związanych z przetwarzaniem i wyświetlaniem obrazów można wykorzystać bibliotekę CImg. Biblioteka ta definiuje szablony m.in. klasy CImg i CImgDisplay, udostępniających funkcjonalności przetwarzania i wyświetlania obrazów. Prosty kod, prezentujący sposób wykorzystania biblioteki CImg przedstawiony jest na Listingu 1. Szczegółowe informacje o kompilacji można znaleźć tutaj.
Listing 1
//kompilacja w Windows
//g++ -o skladoweSpojne.exe skladoweSpojne.cpp -O2 -lgdi32 -I"d:/TOOLS/CImg"
//plik nagłówkowy CImg.h znajduje się w kartotece d:/TOOLS/CImg
#include "CImg.h"
using namespace cimg_library;
int main(int argc,char **argv)
{
int i,j;
CImg<unsigned char> dane;
dane.resize(400,400,1,1);
CImgDisplay mainDisplay(dane,"dane",1);
for(i=0;i<dane.width();i++)
{
for(j=0;j<dane.height();j++)
{
dane(i,j)=255;
}
dane.display(mainDisplay);
mainDisplay.wait(100);
}
system("PAUSE");
return 0;
}
Instrukcja CImg<unsigned char> dane to wywołanie konstruktora klasy CImg<unsigned char>, utworzonej w oparciu o szablon klasy CImg. Instrukcja dane.resize(...) alokuje pamięć na przetwarzany obraz. Instrukcja CImgDisplay mainDisplay(dane,"dane",1) tworzy strukturę mainDisplay typu CImgDisplay, która posłuzy do wyświetlenia obrazu zapisanego w obiekcie dane. Ponadto konstruktor CImgDisplay pobiera tytuł okna, w którym wyświetlony będzie obraz oraz informacje o sposobie prezentacji danych (ostatni argument równy 1 oznacza, że stopnie szarości w obrazie będą rozszerzone przy wyświetlaniu do skali 0-255). Instrukcja dane.display(mainDisplay) wyświetla obraz, a mainDisplay.wait(100) to zatrzymanie przetwarzania na 100 milisekund.
Jednym z typowych zadań wykonywanych przy przetwarzaniu obrazów jest identyfikacja składowych spójnych na obrazach binarnych. Na Rysunku 1 przedstawiono obraz na którym znajduje się 6 składowych spójnych.
Rysunek 1 Przykładowy obraz struktury zawierającej 6 składowych spójnych
Przykładowy algorytm detekcji składowych spójnych mógłby wyglądać następująco:
Wejście
analizowany obraz binarny (0 - tło,255 - struktura),
obraz tymczasowy (wszystkie piksele ustawione na 0),
liczba znalezionych składowych spójnych N=0
tymczasowa struktura danych: kolejka pikseli (piksel jest strukturą przechowującą informację o współrzędnych x i y na obrazie i kolorze)
Pętla główna
Dla wszystkich pikseli obrazu {
Jeżeli piksel P obrazu wejściowego ma kolor 255 i odpowiadający mu piksel obrazu tymczasowego ma wartość zero to {
zwiększ N o 1
ustaw piksel P obrazu tymczasowego na N
dodaj P do kolejki
dopóki kolejka jest niepusta {
usuń pierwszy element (nazwijmy go Q) z kolejki
dla wszystkich sąsiadów R piksela Q {
jeżeli piksel R obrazu wejściowego ma kolor 255 i odpowiadający mu piksel obrazu tymczasowego ma wartość zero to {
dodaj R do kolejki
ustaw piksel R obrazu tymczasowego na N
}
}
}
}
}
Do implementacji powyższego algorytmu znakomicie nadaje się biblioteka STL (standard template library), a w szczególności szablony kolejek (queue).
Proszę zaimplementować algorytm poszukiwania składowych spójnych na obrazie binarnym. Program ma korzystać z bibliotek CImg (do prezentacji wyników) i queue (do poszukiwania składowych). Po znalezieniu każdej składowej program powinien odczekać np.1 sekundę przed podjęciem dalszych działań. Na wyjściu algorytm ma wypisać liczbę i ilość pikseli w każdej ze składowych spójnych. Na wejściu program pobiera dane z pliku BMP - należy wykorzystać metodę load_bmp klasy CImg.
Rekonstrukcja z markerów jest jedną z ważniejszych operacji matematycznej morfologii. Algorytm rekonstrukcji na wejściu wymaga podania dwóch obrazów binarnych - analizowanej struktury i markera. Na wyjściu algorytm zwraca tylko te składowe spójne, które mają niezerową część wspólną z markerem. Korzystając z kodu zaimplementowanego w Zadaniu 1 proszę zaimplementować algorytm rekonstrukcji z markerów.