示範使用 C++ 與 ITK 函式庫從 3D 的影像中取出其中一張 slice 的做法,主要利用 itk::ExtractImageFilter 這個 Filter 來達成,詳細的作法如下,首先用 typedef 定義 3D 與 2D 的影像類型:
typedef itk::Image< unsigned char, 3 > SCALAR_3D_IMAGE; typedef itk::Image< unsigned char, 2 > SCALAR_2D_IMAGE;
接著使用 itk::ImageFileReader 讀取原始的 3D 影像:
itk::ImageFileReader< SCALAR_3D_IMAGE >::Pointer reader = itk::ImageFileReader< SCALAR_3D_IMAGE >::New(); reader->SetFileName(imageFilename);
其中 imageFilename 要換成自己的檔案名稱,接著設定要取出的 slice,假設每張 slice 影像的大小是 512×512,要擷取其中的第 23 張,則:
SCALAR_3D_IMAGE::IndexType desiredStart; desiredStart.SetElement(0, 0); desiredStart.SetElement(1, 0); desiredStart.SetElement(2, 22); SCALAR_3D_IMAGE::SizeType desiredSize; desiredSize.SetElement(0, 512); desiredSize.SetElement(1, 512); desiredSize.SetElement(2, 0); SCALAR_3D_IMAGE::RegionType desiredRegion(desiredStart, desiredSize);
注意這裡的 desireSize 第三個維度指定為 0,這樣 ITK 在轉換時就會自動把 size 為 0 的維度去掉,也就是會把 3D 的資料轉為 2D,若是設為 1 的話,產生的資料就會是三維空間中的 slice。
接著使用 itk::ExtractImageFilter 從 3D 的 volume 中取出指定的 2D slice:
itk::ExtractImageFilter< SCALAR_3D_IMAGE, SCALAR_2D_IMAGE >::Pointer extractFilter = itk::ExtractImageFilter< SCALAR_3D_IMAGE, SCALAR_2D_IMAGE >::New(); extractFilter->SetInput(reader->GetOutput()); extractFilter->SetExtractionRegion(desiredRegion); extractFilter->SetDirectionCollapseToIdentity(); extractFilter->Update(); SCALAR_2D_IMAGE* slice = extractFilter->GetOutput();
其中 slice 就是取出的 2D 圖。