wtorek, 27 października 2009

Sposób na przycinanie danych i szybką wizualizację objętościową w VTK

Problem, który opisywałem jakiś czas temu we wpisie "Przycinanie danych do wizualizacji w VTK" (sekcja: vtkClipVolume), dotyczący zawężania pola widzenia w wizualizacji objętościowej można rozwiązać łatwiej aniżeli mogłoby się wydawać. Nie trzeba korzystać z wyrafinowanych metod dedykowanych w VTK do przycinania danych, tylko wystarczy nałożyć na obraz wcześniej przygotowaną maskę.

Przykład

W tym przykładzie zostanie pokazane jak w danych wyciąć kulę. Zadanie to będzie o tyle łatwe, ponieważ w VTK istnieje już klasa wspomagająca rysowane kuli na obrazie, dzięki czemu nie musimy przeprowadzać sami żadnych operacji na pikselach (w przypadku innych kształtów niestety będzie to konieczne). Następnie tworzymy obiekt reprezentujący maskę (vtkImageMask), do którego przekazujemy obraz wejściowy i właśnie przygotowany obraz z kulą. Możemy również ustalić jakie wartości mają zostać wstawione w miejsce wyciętej kuli. W naszym przypadku wstawiamy "zera".
set extent [[reader GetOutput] GetExtent]
vtkImageEllipsoidSource imageSphere
imageSphere SetWholeExtent 0 [lindex $extent 1] 0 [lindex $extent 3] 0 [lindex $extent 5]
imageSphere SetCenter 40 40 40
imageSphere SetRadius $radius $radius $radius

vtkImageMask mask
mask SetImageInput [reader GetOutput]
mask SetMaskInput [imageSphere GetOutput]
mask SetMaskedOutputValue 0 0 0
mask NotMaskOn
mask ReleaseDataFlagOff

Tak przygotowany obiekt mask wstawiamy do potoku przetwarzania tradycyjnej wizualizacji objętościowej. Wynik tego działania możemy zobaczyć poniżej:


Dużą zaletą tego podejścia jest to, że operacja przycinania danych jest wykonywana jednorazowo i w żaden sposób nie wpływa na szybkość renderowania wizualizacji.

2 komentarze:

Lukasz pisze...

Witam.
Czy istniej możliwość wykonania odwrotnej operacji, tzn. ogranicznia danych tylko do danyc zawartych w kuli?

Bardzo proszę Szanownego Pana , o jakąś wskazówkę.
Pozdrawiam.

Rafał Petryniak pisze...

E tam, proszę nie przesadzaj z grzecznościami. To jest blog internetowy, a nie podanie o pracę;) Zwracaj się do mnie bezpośrednio.

Aby uzyskać odwrotny efekt, aniżeli ten opisany we wpisie wystarczy umieścić w komentarz instrukcję 'mask NotMaskOn'. Powodzenia:)

Prześlij komentarz