Przejdź do głównej zawartości

Materiał towarzyszący do 3D Slicer — pomost do kursu Jana Witowskiego

To materiał towarzyszący, a nie instrukcja opisująca krok po kroku każdy przycisk. Dla każdej zweryfikowanej lekcji Witowskiego łączy czynność w Slicerze z pojęciem z obrazowania omawianym w naszych rozdziałach, wskazuje, na co zwrócić uwagę i co może pójść nie tak, oraz proponuje małe ćwiczenie na rzeczywistych danych RIDER/TRACE-CT. Korzystaj z niego razem z kursami i nagraniami oraz oficjalnym 3D Slicer Training Compendium (training.slicer.org).

Kurs: 3D Slicer Tutorial Jana Witowskiego — playlista YouTube (11 filmów, nagranych w Slicer 4.10.2, ok. 2019 r.; tytuły zweryfikowano 2026-08-10): https://www.youtube.com/playlist?list=PLeaIM0zUlEqswa6Pskg9uMq15LiWWYP39

Zwróć uwagę na rzeczywisty zakres playlisty: obejmuje podstawy, segmentację ręczną, progową i Grow from seeds, wygładzanie, eksport, objętość segmentu, renderowanie powierzchniowe i objętościowe, pomiary 2D, nawigację i kadrowanie oraz anonimizację DICOM. Nie zawiera osobnych lekcji o transformacjach i rejestracji, statystykach segmentu ani PyRadiomics — w tych tematach skorzystaj z oficjalnej dokumentacji i Training Compendium (poniżej) oraz rozdz. 2–3. Interfejs Slicera zmienił się od wersji 4.10; pojęcia pozostały te same, ale niektóre przyciski przeniesiono.

Wersjonowany przykład pydicom

Poniższy przykład jest przypisany do wersji pydicom 3.0.2 (dokumentację sprawdzono 2026-09-03). Wykonywalne szczegóły API pozostają dzięki temu w materiale towarzyszącym, a stabilny rozdział nie zależy od konkretnej wersji biblioteki. dcmread używa domyślnego ustawienia force=False; force=True jest przeznaczone dla niezgodnych plików, w których brakuje wymaganych struktur formatu pliku, dlatego nie jest używane w tej kontroli kontraktu. Wersjonowane operacje opisują oficjalne materiały: dokumentacja dcmread, przewodnik po danych pikselowych, dokumentacja pixel_array, dokumentacja apply_rescale i dokumentacja UID.

import pydicom
import pydicom.pixels
ds = pydicom.dcmread("one_slice.dcm")
print(ds.SOPClassUID.name)
print(ds.Modality)
print(ds.PatientID, ds.StudyInstanceUID, ds.SeriesInstanceUID)
print(ds.SOPInstanceUID)
print(ds.Rows, ds.Columns, ds.BitsAllocated, ds.PixelRepresentation)
print(ds.RescaleSlope, ds.RescaleIntercept)
print(ds.PixelSpacing) # row spacing, column spacing in mm
print(ds.ImagePositionPatient)
print(ds.ImageOrientationPatient)
print(ds.SliceThickness, getattr(ds, "SpacingBetweenSlices", None))
print(ds.ConvolutionKernel)
stored = ds.pixel_array
transformed = pydicom.pixels.apply_rescale(ds.pixel_array, ds)
print("stored min/max:", stored.min(), stored.max())
print("transformed min/max:", transformed.min(), transformed.max())

Końcowa tablica jest wynikiem właściwego dla danego obiektu przeskalowania liniowego lub Modality LUT. Dla ograniczonego przypadku klasycznego CT wynikiem są HU; kod nie może zakładać, że każdy obiekt DICOM używa tego samego przekształcenia.

Pomost między kolejnymi lekcjami a pojęciami

#1 Basics

  • Czynność w Slicerze: wczytaj dane z Welcome/sample data, poznaj układ interfejsu i sterowanie myszą (przewijanie przekrojów, powiększanie, szerokość/poziom okna).
  • Pojęcie: przeglądarka wyświetla objętość umiejscowioną w przestrzeni (rozdz. 2 — przestrzeń fizyczna); szerokość/poziom okna odwzorowują HU na obraz ekranowy (rozdz. 1 — HU).
  • Zwróć uwagę: przekroje osiowy, czołowy i strzałkowy są obliczane na podstawie jednej geometrii.
  • Co może pójść nie tak: pomylenie okna wyświetlania z zapisanymi HU; powiększenie ≠ rozdzielczość.
  • Ćwiczenie (RIDER): wczytaj CT z RIDER, zastosuj przypisane ustawienie CT_LUNG programu Slicer (W=1400, L=-500 w tym commicie źródłowym Slicera), sprawdź miąższ i porównaj wyświetlane odstępy z wynikiem pydicom (zadanie 4 w rozdz. 1). Wartości ustawienia są zależnymi od wersji parametrami wyświetlania, a nie semantyką HU.

#2 Manual segmentation. Thresholding. (opens with the DICOM Browser)

  • Czynność w Slicerze: zaimportuj badanie DICOM (DICOM Browser), a następnie użyj Segment Editor → Threshold (wybór zakresu HU) oraz ręcznego malowania i wymazywania.
  • Pojęcie: maska z geometrią odniesienia (rozdz. 2 — reprezentacje segmentacji); progowanie na podstawie HU (rozdz. 1). Podczas importu pliki są grupowane według SeriesInstanceUID, a układ odniesienia zostaje rozpoznany (hierarchia w rozdz. 1, rozdz. 2 — FoR).
  • Zwróć uwagę: próg jest przedziałem HU — utrwala w wyniku przyjęte założenie dotyczące nachylenia i wyrazu wolnego; maska dziedziczy geometrię objętości.
  • Co może pójść nie tak: wynik progowania obejmuje sąsiednią tkankę o podobnych HU; maska znajduje się na niewłaściwej objętości odniesienia.
  • Ćwiczenie (RIDER): zastosuj progowanie do struktury kostnej albo wzmocnionej kontrastowo, a następnie sprawdź geometrię odniesienia w module Segmentations. Uzupełnienie: Training Compendium STC-DICOM-101 (DICOM and Slicer) i STC-VIS-101 (Data Loading & Visualization).

#3 Scissors. Grow from seeds.

  • Czynność w Slicerze: Scissors (wycinanie w 2D/3D) oraz Grow from seeds (rozrost obszaru od umieszczonych ziaren pierwszego planu i tła).
  • Pojęcie: segmentacja półautomatyczna; model „geometria odniesienia + dyskretna etykieta” (rozdz. 2 — reprezentacje segmentacji); Grow from seeds propaguje etykiety, ale wynik nadal musi leżeć na siatce CT.
  • Zwróć uwagę: niewielka zmiana położenia ziarna może przesunąć granicę — to niestabilność segmentacji (rozdz. 3 — odporność).
  • Co może pójść nie tak: rozrost przez nieszczelność do sąsiedniej struktury anatomicznej; ziarna umieszczone na niewłaściwym przekroju.
  • Ćwiczenie (RIDER): wysegmentuj guz za pomocą Grow from seeds; nieznacznie przesuń jedno ziarno i obserwuj zmianę maski — to namacalna demonstracja zależności segmentacji (rozdz. 3).

#4 Smoothing. Plugins.

  • Czynność w Slicerze: efekty wygładzania (np. Gaussian/median) oraz wtyczki/efekty Segment Editor.
  • Pojęcie: przetwarzanie maski po segmentacji zmienia cechy kształtu (rozdz. 3) oraz jakość granicy (rozdz. 2 — segmentacja).
  • Zwróć uwagę: wygładzanie usuwa małe wypukłości — może poprawić wygląd, ale zmienia miary objętości i powierzchni.
  • Co może pójść nie tak: nadmierne wygładzenie usuwa rzeczywistą anatomię albo zmienia pomiar.
  • Ćwiczenie (RIDER): zmierz objętość segmentu przed wygładzeniem i po nim (użyj #6); zanotuj zmianę.

#5 Exporting and saving

  • Czynność w Slicerze: zapisz scenę/segmentację (.seg.nrrd, .nrrd, scena MRB); wyeksportuj objętość mapy etykiet.
  • Pojęcie: przejście od obiektu segmentacji do maski binarnej i z powrotem (rozdz. 2 reprezentacje segmentacji); .nrrd przechowuje geometrię (SimpleITK/NRRD), a DICOM SEG jest ustrukturyzowaną postacią wymiany.
  • Zwróć uwagę: który format zachowuje geometrię odniesienia i tożsamość segmentu.
  • Co może pójść nie tak: eksport samej tablicy bez geometrii; utrata odniesienia do obrazu źródłowego.
  • Ćwiczenie (RIDER): wyeksportuj maskę jako .seg.nrrd i wczytaj ją w Pythonie za pomocą SimpleITK; potwierdź, że spacing/origin/direction odpowiadają CT (rozdz. 2 — zmiana próbkowania).

#6 Computing segment volume

  • Czynność w Slicerze: Segment Statistics / obliczenie objętości segmentu.
  • Pojęcie: segmentacja → pomiar → fenotyp ilościowy (rozdz. 3, notatka §2); objętość = Σ wokseli × objętość woksela, gdzie objętość woksela = sx × sy × sz (równa sx³ tylko wtedy, gdy rozstaw jest izotropowy — dla danych anizotropowych nie zapisuj spacing³).
  • Zwróć uwagę: objętość zależy od rozstawu wokseli i granicy maski — zapisz oba te elementy.
  • Co może pójść nie tak: podanie objętości bez rozstawu wokseli, przy którym ją obliczono.
  • Ćwiczenie (RIDER): oblicz objętość guza; zmień próbkowanie na inny rozstaw wokseli (rozdz. 2 — zmiana próbkowania) i oblicz ją ponownie — zanotuj zmianę.

#7 Surface vs Volume Rendering

  • Czynność w Slicerze: model powierzchniowy 3D (marching cubes) i renderowanie objętościowe (ray casting).
  • Pojęcie: powierzchnia to siatka wyodrębniona z maski (wizualizacja kształtu), a renderowanie objętościowe jest bezpośrednią projekcją intensywności. Obie metody służą do wizualizacji i żadna z nich nie zmienia danych.
  • Zwróć uwagę: poszarpanie modelu powierzchniowego ujawnia efekty objętości częściowej i szum etykiet (rozdz. 2 objętość częściowa/zmiana próbkowania); renderowanie objętościowe pokazuje HU, a powierzchnia — maskę.
  • Co może pójść nie tak: uznanie atrakcyjnego modelu powierzchniowego za dowód dokładności pomiaru.
  • Ćwiczenie (RIDER): przełączaj się między renderowaniem powierzchniowym a objętościowym maski guza; szukaj migotania granicy (objętość częściowa) i artefaktów warstwowych (grubość warstwy).

#8a 2D Measurements

  • Czynność w Slicerze: pomiary linii, kątów i obszarów na przekrojach.
  • Pojęcie: ręczne obrazowanie ilościowe (rozdz. 3); podstawa pomiarów w stylu RECIST i pomiarów morfometrycznych.
  • Zwróć uwagę: linia 2D nie uwzględnia rozmiaru poza płaszczyzną; umiejscowienie linii różni się między oceniającymi (rozdz. 6 — zmienność między oceniającymi).
  • Co może pójść nie tak: podanie pojedynczej średnicy tak, jakby opisywała cały zasięg 3D.

#8b Navigation, Location and Cropping

  • Czynność w Slicerze: wzajemne wskazywanie przecięcia płaszczyzn przekrojów, przejście do współrzędnej, kadrowanie/ROI.
  • Pojęcie: nawigacja w fizycznych współrzędnych pacjenta (LPS) (rozdz. 2 — przestrzeń fizyczna).
  • Zwróć uwagę / co może pójść nie tak: rozróżnij dwie bardzo odmienne operacje.
    • Proste przycięcie zakresu / podobjętości (np. Crop Volume z wyłączonym izotropowym rozstawem wokseli wyjściowych albo zapisanie podobjętości wyznaczonej ramką ograniczającą) może zachować rozstaw i kierunek, zmieniając tylko początek (narożnik nowej podobjętości).
    • Moduł Crop Volume w Slicerze jest jednak zwykle skonfigurowany z ROI odniesienia i wyjściowym rozstawem wokseli; w takim przypadku wykonuje zmianę próbkowania danych — wyjściowy rozstaw i interpolacja różnią się od źródłowych, a geometria ulega zmianie. Nigdy nie zakładaj, że geometria zostanie zachowana: po każdym kadrowaniu wyświetl wartości spacing/origin/direction danych wyjściowych i sprawdź, czy wykonano zmianę próbkowania oraz jakiego interpolatora użyto (rozdz. 2 — zmiana próbkowania).
  • Ćwiczenie (RIDER): przytnij objętość do obszaru guza, a następnie potwierdź albo wykryj, czy zapisana podobjętość nadal ma ten sam rozstaw i kierunek co dane oryginalne; jeśli zmieniono próbkowanie, zapisz docelowy rozstaw i interpolator.

#9 Anonymizing DICOMs

  • Czynność w Slicerze: anonimizacja DICOM (usuwanie/zastępowanie identyfikatorów).
  • Pojęcie: granica danych i deidentyfikacja (rozdz. 1, rozdz. 5 — awarie przepływu pracy); wiele tagów DICOM i napisów trwale zapisanych w pikselach zawiera PHI.
  • Zwróć uwagę: pełna anonimizacja jest trudna — prywatne tagi i tekst zapisany w pikselach mogą przetrwać naiwne usuwanie tagów.
  • Co może pójść nie tak: „zdeidentyfikowany” eksport, który nadal ujawnia PHI.
  • Ćwiczenie: przeprowadź anonimizację, a następnie przed udostępnieniem sprawdź dane wyjściowe za pomocą pydicom pod kątem pozostałych PatientID/PatientName/prywatnych tagów. (Nigdy nie umieszczaj danych pacjentów w repozytorium — wymusza to .gitignore.)

Tematy nieobecne na playliście Witowskiego — skorzystaj z oficjalnych materiałów

  • Transformacje / rejestracja — moduły Slicera Transforms i General Registration (BRAIN/Affine/BSpline). Pojęcie: zmiana kierunku/początku w celu wyrównania układów odniesienia (rozdz. 2 — przestrzeń fizyczna/zmiana próbkowania). Training Compendium: Registration tutorials + Slicer Registration Case Library.
  • Statystyki segmentu / SlicerRadiomics — zainstaluj rozszerzenie SlicerRadiomics; oblicz cechy interaktywnie (rozdz. 3). Pojęcie: potok radiomiki w interfejsie.
  • Przegląd DICOM SEG — wczytaj obiekt SEG; Slicer dekoduje grupy funkcjonalne poszczególnych ramek (rozdz. 2 — reprezentacje SEG). Uzupełnienie: dcmqi/highdicom do niezawodnego dekodowania.

Oficjalne materiały 3D Slicer

  • 3D Slicer Training Compendium — https://training.slicer.org/ (VERIFIED). Samouczki krok po kroku z przykładowymi danymi. Istotne materiały: STC-GEN-101 (Welcome), STC-VIS-101 (Data Loading & Visualization), STC-VIS-102 (Data Loading & 3D Visualization), STC-DICOM-101 (DICOM and Slicer), STC-DICOM-102 (DICOM Image Visualization), STC-SEG-102 (Segmentation for 3D Printing), STC-SEG-103 (AI-Based Segmentation via MONAIAuto3DSeg), STC-DEV-101 (Scripting). Autorzy: Sonia Pujol et al.
  • Dokumentacja modułu DICOM w Slicerze — https://slicer.readthedocs.io/en/latest/user_guide/modules/dicom.html (import, hierarchia i inspekcja metadanych).
  • Dokumentacja modułu Volumes w Slicerze — https://slicer.readthedocs.io/en/latest/user_guide/modules/volumes.html (odstępy, początek i ustawienia wyświetlania).
  • Slicer Segmentation Recipes — lassoan.github.io/SlicerSegmentationRecipes (praktyczne techniki segmentacji).
  • Slicer Discourse — discourse.slicer.org (pytania i odpowiedzi).

Visual QC — ćwiczenie podsumowujące (nieobecne na playliście)

Przeprowadź rzeczywisty proces Visual QC z TRACE-CT (rozdz. 2 — Visual QC): wyeksportuj pakiet QC (scripts/visual_qc/export_rider_qc.py) i otwórz go za pomocą tools/slicer/open_qc_bundle.py (niestandardowy układ 2×3: dane źródłowe i przetworzone × przekrój osiowy/czołowy/strzałkowy, okno płucne). Przejrzyj dane źródłowe i przetworzone, potwierdź, że maska pokrywa się z guzem, sprawdź granicę 3D i zapisz werdykt za pomocą scripts/visual_qc/record_review.py. W ten sposób wszystkie powyższe pojęcia składają się na jeden audytowalny przebieg kontroli jakości.

© 2026 Adrian Tkacz · BioMedical-IT
Oryginalne teksty i ilustracje są udostępniane na licencji Creative Commons Uznanie autorstwa–Użycie niekomercyjne 4.0 Międzynarodowe (CC BY-NC 4.0), o ile nie zaznaczono inaczej. Przy ponownym wykorzystaniu proszę podać Adrian Tkacz / BioMedical-IT jako autora i zamieścić odnośnik do oryginalnego źródła. Materiały osób trzecich zachowują własne prawa i warunki licencyjne.