Pokazywanie postów oznaczonych etykietą Insight Toolkit (ITK). Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą Insight Toolkit (ITK). Pokaż wszystkie posty

wtorek, 6 października 2009

Jak skompilować InsightToolkit ze źródeł i podłączyć do TCLa i Pythona?

0 komentarze
Podobnie jak w przypadku VTK instalacja InsightToolkit w Ubuntu 9.04 sprowadza się do wpisania w terminalu następującego polecenia:
sudo apt-get install insighttoolkit3-examples libinsighttoolkit3-dev libinsighttoolkit3.10 tcl8.4-insighttoolkit3 python-insighttoolkit3

Podobnie również tutaj, występuje problem z dostępem do najnowszej wersji biblioteki (wersja w repozytorium na dzień dzisiejszy - 6 paź '09 - to 3.10, a na stronie projektu jest już dostępna wersja 3.16). Dlatego jeśli zależy nam na najświeższej wersji, możemy ją sami przygotować kompilując bibliotekę ze źródeł.

Ze strony ITK, z działu Download pobieramy następujące pliki: InsightToolkit-3.16.0.tar.gz, InsightApplications-3.16.0.tar.gz, CableSwig-ITK-3.16.0.tar.gz, lub ich nowsze wersje. Po ich rozpakowaniu do wcześniej przygotowanego katalogu, najpierw skompilujemy CableSwig - pakiet używany do opakowania (ang. wrapping) kodu C++ do innych języków programowania. Nie wymaga on ustawiania żadnych niestandardowych opcji kompilacji, dlatego po przejściu do katalogu CableSwig-ITK-3.16.0 wystarczy wpisać następującą sekwencję poleceń:
mkdir build && cd build && cmake ../ && make

Następnie przechodzimy do katalogu InsightToolkit-3.16.0, zakładamy katalog build i po przejściu do niego uruchamiamy graficzną nakładkę na CMake:
mkdir build && cd build && cmake-gui ../

W kolejnym kroku ustawiamy odpowiednie opcje kompilacji. Poniższa propozycja umożliwi połączenie ITK z językami skryptowymi TCL i Python.
BUILD_EXAMPLES                 OFF
BUILD_SHARED_LIBS ON
BUILD_TESTING OFF
CMAKE_BUILD_TYPE Release
CMAKE_INSTALL_PREFIX /opt
CableSwig_DIR /home/rafal/install/itk/CableSwig-ITK-3.16.0/build
ITK_USE_REVIEW ON
ITK_USE_PATENTED ON
ITK_USE_REVIEW_STATISTICS OFF
USE_WRAP_ITK ON
INSTALL_WRAP_ITK_COMPATIBILITY ON
WRAP_ITK_JAVA OFF
WRAP_ITK_PYTHON ON
WRAP_ITK_TCL ON

Uruchamiamy kompilację i instalujemy bibliotekę:
make
sudo make install

Uwagi odnośnie kompilacji:
  • Liczba przykładów i testów w ITK jest ogromna. Warto zatem je wyłączyć (opcje: BUILD_EXAMPLES i BUILD_TESTING) przy pierwszej kompilacji, bo w przeciwnym wypadku kompilacja może potrwać nawet kilka godzin. Jeśli proces kompilacji zakończy się poprawnie, kompilację przykładów polecam włączyć w wolnym czasie, np. w nocy.
  • Opcje BUILD_SHARED_LIBS i ITK_USE_REVIEW są wymagane po włączeniu opcji USE_WRAP_ITK.
  • W wersji ITK 3.16, którą testowałem, włączenie opcji ITK_USE_REVIEW_STATISTICS i USE_WRAP_ITK spowodowało błędy w kompilacji. Dlatego jeśli nam bardziej zależy na połączeniu z językami skryptowymi, polecam wyłączenie testowego modułu statystyk.

Jak połączyć ITK i Python?

Ustawiamy zmienną środowiskową PYTHONPATH na odpowiedni katalog:
export PYTHONPATH=/opt/lib/python2.6/site-packages

Jak podłączyć ITK i TCL?

Ustawiamy następujące zmienne systemowe:
export TCLLIBPATH=/opt/lib/InsightToolkit/WrapITK/Tcl
export LD_LIBRARY_PATH=/opt/lib/InsightToolkit

Testujemy połączenie z TCL:
tclsh
%puts $auto_path
%package require InsightToolkit
3.16.0

Automatyczne podłączenie TCL i Python przy starcie systemu
Aby nie ustawiać ręcznie zmiennych systemowych po każdym włączeniu komputera, możemy je dopisać do pliku ~/.bashrc, a system sam zrobi to za nas.
Poniżej przykład wpisu uwzględniający również VTK:
nano ~/.bashrc

export TCLLIBPATH="/opt/lib/vtk-5.4 /opt/lib/InsightToolkit/WrapITK/Tcl"
export LD_LIBRARY_PATH=/opt/lib/vtk-5.4:/opt/lib/InsightToolkit
export PYTHONPATH=/opt/lib/python2.6/site-packages

Instalacja ITK Application

Pakiet InsightToolkit sam w sobie zawiera tylko proste przykłady pokazujące jak pracować z biblioteką. Zbiór bardziej zaawansowanych przykładów jest dostępny w pakiecie InsightApplication (opis tych programów jest dostępny na stronie projektu, w dziale Applications).

Zdecydowana większość aplikacji korzysta z biblioteki FLTK do obsługi GUI. Możemy ją zainstalować następującym poleceniem:
sudo apt-get install libfltk1.1 libfltk1.1-dev fluid fltk1.1-doc

Następnie uruchamiamy CMake i ustawiamy, które aplikacje powinny zostać przygotowane. Ja wybrałem zdecydowaną większość z nich, z wyłączeniem wtyczek do Volview (pobierając Volview wtyczki są już skompilowane).
BUILD_SHARED_LIBS        OFF
BUILD_TESTING OFF
CMAKE_BUILD_TYPE Release
CMAKE_INSTALL_PREFIX /opt
ITK_DIR /opt/lib/InsightToolkit
USE_FLTK ON
USE_VTK ON
VTK_DIR /opt/lib/vtk-5.4
USE_VolviewPlugins OFF
USE_AUXILIARY ON


Instalacja biblioteki InsightToolkit ze źródeł daje nam pewność, że korzystamy z jej najnowszej wersji, a możliwość wyboru parametrów kompilacji pozwala na dopasowanie jej do aktualnych potrzeb.

poniedziałek, 9 lutego 2009

Łączymy VTK i ITK

0 komentarze
Visualization Toolkit i Insight Toolkit pomimo tego, że są zupełnie niezależnymi narzędziami, to potrafią świetnie ze sobą współpracować. Istotny wpływ na to ma na pewno fakt, że nad ich rozwojem czuwa ta sama firma (Kitware), która nie tylko wspiera rozwój tych dwóch wolnych bibliotek, ale również sama tworzy oprogramowanie na nich bazujące (np. VolView).

W domyślnej konfiguracji obu bibliotek nie ma przykładów jak sobie poradzić z ich połączeniem. Najlepiej w takim wypadku pobrać dodatkowe przykłady ze strony ITK, tzw. InsightApplications. Po rozpakowaniu przygotowujemy proces kompilacji z użyciem narzędzia CMake, w którym musimy zaznaczyć zmienną USE_VTK oraz USE_AUXILIARY. Po zakończonej kompilacji możemy zajrzeć do katalogu Auxiliary/vtk, w którym jest kilka prostych przykładów wspólnego wykorzystania VTK i ITK.

Poniżej przedstawiam fragment programu do segmentacji obrazu za pomocą algorytmu działów wodnych (ang. watershed). Przetwarzanie obrazu jest tutaj wykonywane przez ITK, a wizualizacje, które znajdują się poniżej zostały przygotowane w VTK.
DiffusionFilterType::Pointer diffusion = DiffusionFilterType::New();
diffusion->SetNumberOfIterations(20);
diffusion->SetConductanceParameter(2.0);
diffusion->SetTimeStep(0.0625);

GradientMagnitudeFilterType::Pointer gradient = GradientMagnitudeFilterType::New();

WatershedFilterType::Pointer watershed = WatershedFilterType::New();
watershed->SetLevel(0.25);
watershed->SetThreshold(0.01);

diffusion->SetInput( castFilter1->GetOutput() );
gradient->SetInput( diffusion->GetOutput() );
watershed->SetInput( gradient->GetOutput() );

Zrzuty ekranu prezentujące działanie algorytmu działów wodnych:

poniedziałek, 2 lutego 2009

Kompleksowe pakiety wizualizacji medycznej

6 komentarze
Kontynuując serię wpisów "Najlepsze w swojej klasie" tym razem chciałbym napisać o narzędziach szczególnie przydatnych dla końcowego użytkownika, a nie jak to miało miejsce wcześniej dla twórcy aplikacji.
Narzędzi do wizualizacji medycznej, bo to o nich dzisiaj będzie mowa, jest naprawdę sporo. Postaram się omówić te z nich, które oferują największą funkcjonalność i są łatwo dostępne dla każdego. Większość z nich to oprogramowanie Open Source, a pozostałe to okrojone wersje komercyjnych programów.

Aby nie powtażać przy każdym programie z osobna, od razu na początku dodam, że wszystkie poniżej wskazane programy jako silnik do wizualizacji korzystają z VTK, a jeśli umożliwiają przetwarzanie obrazu to opiera się ono na ITK.

Wszystkie zrzuty ekranu, które zostały zamieszczone przy opisach programów wygenerowałem z użyciem pliku tooth.nhdr dołączonego do pakietu SCIRun (opis poniżej).

3D Slicer
[strona WWW]
Bardzo zaawansowane oprogramowanie wykorzystywane głównie w zastosowaniach medycznych. Slicer posiada pokaźną liczbę modułów służących nie tylko do wizualizacji danych przestrzennych, ale również do ich przetwarzania. Bardzo dobrze radzi sobie z formatem DICOM oraz Nrrd. Wbudowany edytor segmentacji obiektów pozwala na szybkie i wygodne oddzielanie poszczególnych struktur anatomicznych. Program pozwala na tworzenie własnych modułów z wykorzystaniem języka Tcl. 3D Slicer jest finansowany przez różne ośrodki medyczne w Stanach, co zapewnia mu stabilny rozwój.



VolView
[strona WWW]
VolView jest komercyjnym programem opracowanym przez firmę Kitware. Istnieje jednak wersja o ograniczonej funkcjonalności, która może być wykorzystywana za darmo również do komercyjnych zastosowań.
Pomimo tego, że w darmowej wersji programu większość modułów jest zablokowanych, to te które są aktywne mają naprawdę duże możliwości. Jednym z nich jest moduł Volume rendering, pozwalający na przygotowanie bardzo realistycznych wizualizacji. Inny moduł gromadzi zewnętrzne moduły Open Source pisane przez różnych użytkowników. Można tu znaleźć wiele przydatnych narzędzi do przetwarzania obrazu w 3D.



Programy SCIRun, BioImage oraz Seg3D rozwijane na uniwersytecie UTAH.
Uniwersytet w UTAH od zawsze był aktywnie zaangażowany w rozwój VTK oraz ITK. Tworzą oni również własne programy, które pokazują możliwości tych dwóch bibliotek. Wśród nich znajdują się:
  • SCIRun [strona WWW] - oprogramowanie ogólnego przeznaczenia służące do wizualizacji i symulacji. W podstawowym trybie pracy algorytmy tworzymy w sposób wizualny. Dodatkowo mamy dostęp do konsoli Tcl, w której możemy pisać własne moduły.
  • BioImage [strona WWW] - wydzielona część SCIRun i oprawiona innym interfejsem. Służy przede wszystkim do wizualizacji 3D.
  • Seg3D [strona WWW] - głównym zadaniem tego programu jest interaktywna segmentacja obrazu w 3D.
    Bazuje on głównie na algorytmach typu region growing dostępnych w ITK. Po wykonaniu segmentacji obiekty mogą zostać wyświetlone w widoku 3D.


MeVisLab
[strona WWW]
O tym programie można śmiało powiedzieć, że jest obecnie najlepszym środowiskiem deweloperskim do tworzenia wizualizacji i algorytmów dla danych przestrzennych. Posiada niemal pełne wsparcie dla VTK i ITK, a także sporą grupę modułów własnych. Dzięki wbudowanemu interpreterowi Pythona łatwo możemy tworzyć własne moduły.
Program posiada wersję do zastosowań niekomercyjnych (edukacja, nauka, prywatne użycie), która ma ograniczenie na liczbę własnych modułów uruchomionych w tym samym czasie.



DeVIDE
[strona WWW]
DeVIDE można określić jako otwarto-źródłowy (Open Source) konkurent dla MeVisLab. Tutaj również programy tworzymy za pomocą schematów blokowych, a moduły wewnętrzne przy użyciu Pythona. W chwili obecnej mamy dostęp do znacznej funkcjonalności VTK, a obsługa ITK może nie jest tak rozbudowana jak w MeVisLab, ale wystarcza do wykonania prostej segmentacji obrazu.



Pozostałe programy do wizualizacji medycznej
Jest jeszcze kilka programów, których nie przetestowałem, ale o których warto wiedzieć.
  • OsiriX [strona WWW] - "rozwijany przez radiologów i dla radiologów" - tak o programie mówią sami jego twórcy. Na początek warto obejrzeć zrzuty ekranu prezentujące możliwości programu. Teraz możemy się zastanowić czy jest on wart zakupu komputera Apple, ponieważ istnieje wersja tylko dla systemu MacOS X. Sam program jest oczywiście darmowy.
  • BioImage Suite [strona WWW] - program rozwijany na Uniwersytecie Yale przy dużym zaangażowaniu Xenios Papademetris, autora książki Introduction to Programming for Image Analysis with VTK
  • GIMIAS [strona WWW] - wyglada zachęcająco, szczególnie tryb manualnej segmentacji.
  • eXtensible Imaging Platform (XIP) [strona WWW] - udostępniony przez Simensa na licencji Open Source program do wizualnego budowania algorytmów z wykorzystaniem VTK i ITK.
  • ImageVis3D [strona WWW] - kolejny program do wizualizacji medycznej opracowany na Uniwersytecie w UTAH. Zachęcająco brzmi deklaracja na stronie projektu o możliwości analizy ogromnej ilości danych, przekraczających ilość dostępnej pamięci RAM.
Programy ogólnego przeznaczenia
Jeśli nie chcemy przetwarzać obrazów 3D, a jedynie je wyświetlać, dodatkowo możemy skorzystać z jednego z poniższych programów.

ParaView
[strona WWW]
Bardzo zaawansowane narzędzie do wizualizacji. Często wykorzystywane do wyświetlania dużych zbiorów danych. Został tak skonstruowany, że może działać w trybie równoległym, przez co bywa instalowany nawet na dużych superkomputerach (więcej o tym, gdzie korzysta się z tego programu można przeczytać na stronie WWW).



MayaVi2
[strona WWW]
Zdecydowanie "lżejszy" program od ParaView. Obsługuje tryb wizualizacji przestrzennej, powierzchniowej oraz przekrojowej.



Pozostałe programy ogólnego przeznaczenia:
Podsumowanie
Wiele osób ciągle przegląda przestrzenne dane medyczne oglądając każdy plik osobno. Często nie zdają one sobie sprawy, że istnieje wiele darmowych programów, które potrafią robić świetne wizualizacje 3D. Mam nadzieje, że ten wpis okaże się dla nich przydatny i znajdą dla siebie odpowiednie narzędzie.

czwartek, 22 stycznia 2009

Nanoszenie wyników detekcji na obraz źródłowy w CImg

0 komentarze
W wyniku segmentacji obrazu otrzymujemy obiekt lub grupę obiektów, które spełniają zadane przez nas kryteria. Dla przykładu, poniżej możemy zobaczyć przekrój mózgu oraz wynik detekcji substancji białej z wykorzystaniem algorytmu Connected Threshold z biblioteki Insight Toolkit. Wydaje się, że całkiem nieźle poszło. Jednak patrzac na te dwa obrazy osobno trudno wizualinie ocenić czy czegoś nie zgubliliśmy lub czy gdzieś nie jest za dużo. Na pewno łatwiej by było po naniesieniu wyniku na obraz źródłowy. O tym właśnie będzie ten wpis.


Korzystając z biblioteki CImg pokażę jak napisać własną funkcję oraz program przydatny w takich sytuacjach.

Podejście pierwsze
Najłatwiej można to oczywiście zrobić iterując po obu obrazach i jeśli w danym punkcie obraz wynikowy ma wartość 255 (biały kolor) to na obrazie źródłowym w tym samym miejscu zmieniamy kolor na inny, wcześniej ustalony. Poniższa funkcja działa właśnie w taki sposób.

template<typename T>
void cimg_nanies_wyniki(CImg<T> &image, CImg<T> &result, unsigned char* color)
{
cimg_forXY(image,x,y) {
if (result(x,y) == 255) {
image(x,y,0) = color[0];
image(x,y,1) = color[1];
image(x,y,2) = color[2];
}
}
}


Patrząc na obraz wynikowy, który powstanie w wyniku wykonania tej funkcji, wydaje się, że mamy to czego potrzebowaliśmy. Jest jednak pewien problem. Pokolorowany obszar przysłania to co jest pod nim i nie widzimy, czy gdzieś nie znajduje się obiekt, który nie należy do poszukiwanego obszaru. Najlepiej w takim wypadku zastosować przeźroczystość podczas kolorowania.




Podejście drugie
Zastosowanie przeźroczystości w CImg wymaga kilku dodatkowych zabiegów aniżeli miało to miejsce w poprzednim przykładzie. Najpierw przygotujemy dodatkowy obraz typy float, który wypełnimy wartością 1.0. Następnie zmienimy wszystkie punkty zgodnie z maską, którą tutaj jest obraz z detekcją. Później ten obraz jest nanoszony na obraz początkowy z użyciem funkcji draw_image, która pozwala na ustalenie przeźroczystości.

template<typename T>
void cimg_nanies_wyniki2(CImg<T> &image, CImg<T> &mask, unsigned char* color, float transp)
{
CImg<T> layer_c = mask;

layer_c.draw_rectangle(0, 0, layer_c.dimx(), layer_c.dimy(), color, 1.0);

CImg<T> layer_f1 = mask;
cimg_forXY(layer_f1,x,y)
layer_f1(x,y) = (layer_f1(x,y,0)==255 && layer_f1(x,y,1)==255 && layer_f1(x,y,2)==255)?0.0f:1.0f;
CImg<T> layer_f2=layer_f1.get_shared_channel(0);

image.draw_image(layer_c,layer_f2,0,0,0,0,1.0f,transp);
}
Po wywołaniu tej funkcji otrzymujemy obraz wejściowy z naniesionym wynikiem detekcji. Teraz już znacznie łatwiej ocenić, czy zastosowany przez nas algorytm segmentacji zadziałał poprawnie.



Przykładowa funkcja main
Dodatkowo została zaprezentowana funkcja main() odbierająca parametry z wiersza poleceń i wywołująca funkcję cimg_nanies_wyniki2(). Po jej skompilowaniu otrzymamy gotowy program, który może być wielokrotnie używany, a nawet dodawany do istniejących skryptów w celu prezentacji wyników.

#include <iostream>
#include <ostream>
#include "../CImg.h"

using namespace std;
using namespace cimg_library;

unsigned char white[3]={255,255,255},
black[3] = {0,0,0},
red[3] = {255,0,0},
green[3] = {0,255,0},
blue[3] = {0,0,255},
yellow[3] = {255,255,0},
magenta[3] = {255,0,255},
orange[3] = {255,90,0},
middle[3] = {127,127,127}
;

//Tutaj powinna być funkcja cimg_nanies_wyniki2

int main(int argc,char **argv)
{
cimg_usage("Nanies wyniki");

const char* file_i = cimg_option("-i","input.bmp","Input image");
const char* file_o = cimg_option("-o","output.bmp","Output image");
const char* file_m = cimg_option("-m","mask.bmp","Mask image");
const char col = cimg_option("-c",'r',"Color (r-red,g-green,b-blue,y-yellow,m-magenta,o-orange)");
float transp = cimg_option("-t",0.2f,"Transparency");

unsigned char* color=red;
switch (col) {
case 'r': color = red; break;
case 'g': color = green; break;
case 'b': color = blue; break;
case 'y': color = yellow; break;
case 'm': color = magenta;break;
case 'o': color = orange; break;
default: color = red;
}

CImg<unsigned char> image_in(file_i), mask_in(file_m);
mask_in.normalize(255,0);

cimg_nanies_wyniki2(image_in,mask_in,color,transp);
image_in.save(file_o);

return 0;
}


Przykład wywołania:
program -i input.bmp -m mask.bmp -o output.bmp -t 0.15 -c o

środa, 23 lipca 2008

Insight Toolkit

0 komentarze
Najlepsze narzędzie w kategorii: Analiza obrazu - segmentacja, Analiza obrazu - dopasowanie

Insight Toolkit (ITK) jest wspólną inicjatywą amerykańskich naukowców (Uniwersytet Utah, Uniwersytet Pensylwania, inne) mającą na celu ujednolicenie narzędzi przetwarzania obrazu dla potrzeb diagnostyki obrazowej. Główny nacisk został położony na opracowanie algorytmów segmentacji obiektów (ang. image segmentation) oraz dopasowania dwóch obrazów (ang. image registration).

Warto wspomnieć, że w odróżnieniu od Pandory, jest to tylko biblioteka programistyczna C++, a nie gotowe narzędzie. Korzystanie z niej wymaga podstawowych umiejętności programistycznych od użytkownika.

Zalety:
  • Przygotowane interfejsy programistyczne dla Javy, TCLa i Pythona
  • Korzystając z TCLa można pisać skrypty
  • Wykorzystywana w wielu zaawansowanych narzędziach (m.in. Slicer3D, OsiriX)
  • Możliwość potokowego konstruowania algorytmów (wyjście jednej funkcji staje się wejściem następnej)
  • Duże wsparcie finansowe amerykańskich instytucji medycznych daje gwarancje ciągłego rozwoju
  • Pozwala na zamkniecie kodu (licencja BSD)
Wady:
  • Mała ilość operatorów morfologicznych
  • Trudna do nauczenia
Konkurencja:
  • W tym momencie w dziedzinie segmentacji i dopasowania biblioteka ITK jest bezkonkurencyjna
Materiały: