使用 ITK 從 3D 的 Image 中擷取 2D 的 slice

示範使用 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 影像的大小是 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 圖。


本站已經搬家了,欲查看最新的文章,請至 G. T. Wang 新網站

沒有留言:

張貼留言