OpenWalnut  1.4.0
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::dynamic_pointer_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( 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
A grid that has parallelepiped cells which all have the same proportion.
An object that knows an appropriate dataType flag for the typename T.
Base Class for all value set types.
Definition: WValueSet.h:46
This data set type contains scalars as values.
Implements an orthogonal grid transformation.