OpenWalnut  1.3.1
WITKImageConversion.h
1 //---------------------------------------------------------------------------
2 //
3 // Project: OpenWalnut ( http://www.openwalnut.org )
4 //
5 // Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
6 // For more information see http://www.openwalnut.org/copying
7 //
8 // This file is part of OpenWalnut.
9 //
10 // OpenWalnut is free software: you can redistribute it and/or modify
11 // it under the terms of the GNU Lesser General Public License as published by
12 // the Free Software Foundation, either version 3 of the License, or
13 // (at your option) any later version.
14 //
15 // OpenWalnut is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 // GNU Lesser General Public License for more details.
19 //
20 // You should have received a copy of the GNU Lesser General Public License
21 // along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
22 //
23 //---------------------------------------------------------------------------
24 
25 #ifndef WITKIMAGECONVERSION_H
26 #define WITKIMAGECONVERSION_H
27 
28 #ifdef OW_USE_ITK
29 #include <itkImage.h>
30 #endif
31 
32 #include <vector>
33 
34 #include <boost/shared_ptr.hpp>
35 
36 #include "WDataSetScalar.h"
37 
38 #ifdef OW_USE_ITK
39 
40 /**
41  * Create an itk image from a dataset.
42  *
43  * \param dataSet The dataset to convert.
44  *
45  * \return A pointer to a 3D itk image.
46  */
47 template< typename T >
48 typename itk::Image< T, 3 >::Pointer makeImageFromDataSet( boost::shared_ptr< WDataSetScalar const > dataSet )
49 {
50  boost::shared_ptr< WGridRegular3D > grid = boost::shared_dynamic_cast< WGridRegular3D >( dataSet->getGrid() );
51  WAssert( grid, "" );
52 
53  // this is a shared-pointer
54  typename itk::Image< T, 3 >::Pointer img = itk::Image< T, 3 >::New();
55  typename itk::Image< T, 3 >::IndexType i;
56  typename itk::Image< T, 3 >::SizeType s;
57 
58  s[ 0 ] = grid->getNbCoordsX();
59  s[ 1 ] = grid->getNbCoordsY();
60  s[ 2 ] = grid->getNbCoordsZ();
61  i[ 0 ] = i[ 1 ] = i[ 2 ] = 0;
62 
63  typename itk::Image< T, 3 >::RegionType r;
64  r.SetSize( s );
65  r.SetIndex( i );
66 
67  typename itk::Image< T, 3 >::SpacingType spacing;
68  spacing[ 0 ] = grid->getOffsetX();
69  spacing[ 1 ] = grid->getOffsetY();
70  spacing[ 2 ] = grid->getOffsetZ();
71 
72  typename itk::Image< T, 3 >::PointType orig;
73  orig[ 0 ] = grid->getOrigin()[ 0 ];
74  orig[ 1 ] = grid->getOrigin()[ 1 ];
75  orig[ 2 ] = grid->getOrigin()[ 2 ];
76 
77  img->SetRegions( r );
78  img->SetSpacing( spacing );
79  img->SetOrigin( orig );
80  img->Allocate();
81 
82  // copy direction matrix
83  typename itk::Image< T, 3 >::DirectionType dirMat;
84  dirMat( 0, 0 ) = grid->getDirectionX()[ 0 ];
85  dirMat( 0, 1 ) = grid->getDirectionY()[ 0 ];
86  dirMat( 0, 2 ) = grid->getDirectionZ()[ 0 ];
87  dirMat( 1, 0 ) = grid->getDirectionX()[ 1 ];
88  dirMat( 1, 1 ) = grid->getDirectionY()[ 1 ];
89  dirMat( 1, 2 ) = grid->getDirectionZ()[ 1 ];
90  dirMat( 2, 0 ) = grid->getDirectionX()[ 2 ];
91  dirMat( 2, 1 ) = grid->getDirectionY()[ 2 ];
92  dirMat( 2, 2 ) = grid->getDirectionZ()[ 2 ];
93 
94  img->SetDirection( dirMat );
95 
96  for( i[ 0 ] = 0; i[ 0 ] < static_cast< int >( s[ 0 ] ); ++i[ 0 ] )
97  {
98  for( i[ 1 ] = 0; i[ 1 ] < static_cast< int >( s[ 1 ] ); ++i[ 1 ] )
99  {
100  for( i[ 2 ] = 0; i[ 2 ] < static_cast< int >( s[ 2 ] ); ++i[ 2 ] )
101  {
102  img->SetPixel( i, dataSet->getValueAt< T >( i[ 0 ], i[ 1 ], i[ 2 ] ) );
103  }
104  }
105  }
106  return img;
107 }
108 
109 /**
110  * Create a dataset from an itk image.
111  *
112  * \param img The image to convert.
113  *
114  * \return A pointer to the dataset.
115  */
116 template< typename T >
117 boost::shared_ptr< WDataSetScalar > makeDataSetFromImage( typename itk::Image< T, 3 >::Pointer img )
118 {
119  typename itk::Image< T, 3 >::SizeType const& s = img->GetLargestPossibleRegion().GetSize();
120 
121  WMatrix< double > smat( 4, 4 );
122  typename itk::Image< T, 3 >::DirectionType dirMat = img->GetDirection();
123 
124  smat( 0, 0 ) = dirMat( 0, 0 );
125  smat( 0, 1 ) = dirMat( 0, 1 );
126  smat( 0, 2 ) = dirMat( 0, 2 );
127  smat( 1, 0 ) = dirMat( 1, 0 );
128  smat( 1, 1 ) = dirMat( 1, 1 );
129  smat( 1, 2 ) = dirMat( 1, 2 );
130  smat( 2, 0 ) = dirMat( 2, 0 );
131  smat( 2, 1 ) = dirMat( 2, 1 );
132  smat( 2, 2 ) = dirMat( 2, 2 );
133  smat( 0, 3 ) = img->GetOrigin()[ 0 ];
134  smat( 1, 3 ) = img->GetOrigin()[ 1 ];
135  smat( 2, 3 ) = img->GetOrigin()[ 2 ];
136  smat( 3, 3 ) = 1.0;
137  smat( 3, 0 ) = 0.0;
138  smat( 3, 1 ) = 0.0;
139  smat( 3, 2 ) = 0.0;
140 
141  WGridTransformOrtho t( smat );
142  boost::shared_ptr< WGrid > grid( new WGridRegular3D( s[ 0 ], s[ 1 ], s[ 2 ], t ) );
143  boost::shared_ptr< std::vector< T > > v = boost::shared_ptr< std::vector< T > >( new std::vector< T >( s[ 0 ] * s[ 1 ] * s[ 2 ] ) );
144 
145  typename itk::Image< T, 3 >::IndexType i;
146 
147  for( i[ 0 ] = 0; i[ 0 ] < static_cast< int >( s[ 0 ] ); ++i[ 0 ] )
148  {
149  for( i[ 1 ] = 0; i[ 1 ] < static_cast< int >( s[ 1 ] ); ++i[ 1 ] )
150  {
151  for( i[ 2 ] = 0; i[ 2 ] < static_cast< int >( s[ 2 ] ); ++i[ 2 ] )
152  {
153  v->at( i[ 0 ] + i[ 1 ] * s[ 0 ] + i[ 2 ] * s[ 0 ] * s[ 1 ] ) = img->GetPixel( i );
154  }
155  }
156  }
157 
158  boost::shared_ptr< WValueSetBase > values( new WValueSet< T >( 0, 1, v, DataType< T >::type ) );
159 
160  return boost::shared_ptr< WDataSetScalar >( new WDataSetScalar( values, grid ) );
161 }
162 
163 #endif // OW_USE_ITK
164 
165 #endif // WITKIMAGECONVERSION_H