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 影像的大小是 512x512,要擷取其中的第 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 圖。
沒有留言:
張貼留言