*直管を画像に埋め込む(ITKライブラリ) [#k0eb16de]

[[ITK:http://www.itk.org/]]ライブラリを使用して、5本の直管を作成し、画像データに埋め込みます。

#ref(5tube_image.png,center,nowrap,40%,5本の直管画像);



プログラムでは、まず、5本の直管を点列データ(座標+半径)を与えてそれぞれ作成し、最後に[[itk::SpatialObjectToImageFilter:http://www.itk.org/Doxygen/html/classitk_1_1SpatialObjectToImageFilter.html]]関数で画像データに変換します。画像データは101×126×500の3次元の画像データで、出力形式はInsight Meta-Imageファイル(mha)となっています。上図は、出力されたmhaファイルを[[ParaView:http://www.paraview.org/]]で読み込み、ボリュームレンダリングで表示したものです。
プログラムでは、まず、5本の直管を点列データ(座標+半径)を与えてそれぞれ作成し、次に[[itk::SpatialObjectToImageFilter:http://www.itk.org/Doxygen/html/classitk_1_1SpatialObjectToImageFilter.html]]関数で画像データに変換します。画像データは101×126×500の3次元の画像データで、出力形式はInsight Meta-Imageファイル(mha)となっています。上図は、出力されたmhaファイルを[[ParaView:http://www.paraview.org/]]で読み込み、ボリュームレンダリングで表示したものです。


**5TubeSpatialObject.cxx [#y88ae58d]
#code(c){{
#include "itkGroupSpatialObject.h"
#include "itkImageFileWriter.h"
#include "itkSpatialObjectToImageFilter.h"
#include "itkTubeSpatialObject.h"

int main(int argc, char *argv[])
{
  typedef unsigned char PixelType;
  const unsigned int Dimension = 3;

  typedef itk::Image< PixelType, Dimension > ImageType;

  typedef itk::TubeSpatialObject< Dimension > TubeType;
  typedef itk::SmartPointer< TubeType >       TubePointer;
  typedef TubeType::TubePointType             TubePointType;
  typedef TubeType::PointListType             TubePointListType;
  typedef itk::GroupSpatialObject<Dimension>  GroupType;
  typedef itk::SmartPointer< GroupType >      GroupPointer;

  typedef itk::SpatialObjectToImageFilter<
    GroupType, ImageType > SpatialObjectImageFilterType;

  TubePointer tube1 = TubeType::New();
  tube1->GetProperty()->SetName("Tube1");
  tube1->SetId(1);

  TubePointListType list;
  for( unsigned int i = 0; i < 11; ++i )
    {
    double dx = -0.012 * i;
    double dy = 0.4 * i;
    double dz = 0.0135 * i;
    double radius = 0.1;
    TubePointType p;
    p.SetPosition(1.68 + dx, 0.0 + dy, 0.727 + dz);
    p.SetRadius(radius);
    list.push_back(p);
    }

  tube1->SetPoints(list);
  tube1->ComputeBoundingBox();
  list.clear();

  TubePointer tube2 = TubeType::New();
  tube2->GetProperty()->SetName("Tube2");
  tube2->SetId(2);

  for( unsigned int i = 0; i < 11; ++i )
    {
    double dx = 0.5 * i;
    double dy = 0.004  * i;
    double dz =-0.005  * i;
    double radius = 0.1;
    TubePointType p;
    p.SetPosition(0.0 + dx, 2.36 + dy, 1.13 + dz);
    p.SetRadius(radius);
    list.push_back(p);
    }

  tube2->SetPoints(list);
  tube2->ComputeBoundingBox();
  list.clear();

  TubePointer tube3 = TubeType::New();
  tube3->GetProperty()->SetName("Tube3");
  tube3->SetId(3);

  for( unsigned int i = 0; i < 11; ++i )
    {
    double dx =-0.192 * i;
    double dy = 0.048  * i;
    double dz =-0.008  * i;
    double radius = 0.2;
    TubePointType p;
    p.SetPosition(5.0 + dx, 3.52 + dy, 1.29 + dz);
    p.SetRadius(radius);
    list.push_back(p);
    }

  tube3->SetPoints(list);
  tube3->ComputeBoundingBox();
  list.clear();

  TubePointer tube4 = TubeType::New();
  tube4->GetProperty()->SetName("Tube4");
  tube4->SetId(3);

  for( unsigned int i = 0; i < 11; ++i )
    {
    double dx = 0.3 * i;
    double dy = 0.336  * i;
    double dz =-0.004  * i;
    double radius = 0.2;
    TubePointType p;
    p.SetPosition(2.0 + dx, 0.0 + dy, 1.55 + dz);
    p.SetRadius(radius);
    list.push_back(p);
    }

  tube4->SetPoints(list);
  tube4->ComputeBoundingBox();
  list.clear();

  TubePointer tube5 = TubeType::New();
  tube5->GetProperty()->SetName("Tube5");
  tube5->SetId(3);

  for( unsigned int i = 0; i < 11; ++i )
    {
    double dx = 0.02 * i;
    double dy =-0.4  * i;
    double dz =-0.011  * i;
    double radius = 0.4;
    TubePointType p;
    p.SetPosition(2.44 + dx, 4.0 + dy, 2.19 + dz);
    p.SetRadius(radius);
    list.push_back(p);
    }

  tube5->SetPoints(list);
  tube5->ComputeBoundingBox();
  list.clear();

  GroupPointer tubeNet = GroupType::New();
  tubeNet->GetProperty()->SetName("tube network");
  tubeNet->AddSpatialObject(tube1);
  tubeNet->AddSpatialObject(tube2);
  tubeNet->AddSpatialObject(tube3);
  tubeNet->AddSpatialObject(tube4);
  tubeNet->AddSpatialObject(tube5);

  SpatialObjectImageFilterType::Pointer imageFilter =
    SpatialObjectImageFilterType::New();

  ImageType::SizeType size;
  size[0] = 126;
  size[1] = 101;
  size[2] = 500;
  imageFilter->SetSize(size);

  ImageType::SpacingType spacing;
  spacing[0] = 5.0 / (size[0] - 1);
  spacing[1] = 4.0 / (size[1] - 1);
  spacing[2] = 3.07 / (size[2] - 1);
  imageFilter->SetSpacing(spacing);

  imageFilter->SetInsideValue(1);
  imageFilter->SetInput(tubeNet);
  imageFilter->SetChildrenDepth(1);
  imageFilter->Update();
  tubeNet->GetMaximumDepth();

  typedef itk::ImageFileWriter< ImageType > WriterType;
  WriterType::Pointer writer = WriterType::New();
  writer->SetFileName("tube.mha");
  writer->SetInput(imageFilter->GetOutput());
  writer->Update();

  return EXIT_SUCCESS;
}

}}

**ダウンロードとビルド [#k551ac14]
ソースコードと'''CMakeLists.txt'''ファイル:
#ref(5TubeSpatialObject.zip)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS