分類: 程式設計

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

G. T. Wang

個人使用 Linux 經驗長達十餘年,樂於分享各種自由軟體技術與實作文章。

Share
Published by
G. T. Wang

Recent Posts

光陽 KYMCO GP 125 機車接電發動、更換電瓶記錄

本篇記錄我的光陽 KYMCO ...

2 年 ago

[開箱] YubiKey 5C NFC 實體金鑰

本篇是 YubiKey 5C ...

3 年 ago

[DIY] 自製竹火把

本篇記錄我拿竹子加上過期的苦茶...

3 年 ago