OpenWalnut  1.5.0dev
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 <memory>
33 #include <vector>
34 
35 #include "WDataSetScalar.h"
36 
37 #ifdef OW_USE_ITK
38 
39 /**
40  * Create an itk image from a dataset.
41  *
42  * \param dataSet The dataset to convert.
43  *
44  * \return A pointer to a 3D itk image.
45  */
46 template< typename T >
47 typename itk::Image< T, 3 >::Pointer makeImageFromDataSet( std::shared_ptr< WDataSetScalar const > dataSet )
48 {
49  std::shared_ptr< WGridRegular3D > grid = std::dynamic_pointer_cast< WGridRegular3D >( dataSet->getGrid() );
50  WAssert( grid, "" );
51 
52  // this is a shared-pointer
53  typename itk::Image< T, 3 >::Pointer img = itk::Image< T, 3 >::New();
54  typename itk::Image< T, 3 >::IndexType i;
55  typename itk::Image< T, 3 >::SizeType s;
56 
57  s[ 0 ] = grid->getNbCoordsX();
58  s[ 1 ] = grid->getNbCoordsY();
59  s[ 2 ] = grid->getNbCoordsZ();
60  i[ 0 ] = i[ 1 ] = i[ 2 ] = 0;
61 
62  typename itk::Image< T, 3 >::RegionType r;
63  r.SetSize( s );
64  r.SetIndex( i );
65 
66  typename itk::Image< T, 3 >::SpacingType spacing;
67  spacing[ 0 ] = grid->getOffsetX();
68  spacing[ 1 ] = grid->getOffsetY();
69  spacing[ 2 ] = grid->getOffsetZ();
70 
71  typename itk::Image< T, 3 >::PointType orig;
72  orig[ 0 ] = grid->getOrigin()[ 0 ];
73  orig[ 1 ] = grid->getOrigin()[ 1 ];
74  orig[ 2 ] = grid->getOrigin()[ 2 ];
75 
76  img->SetRegions( r );
77  img->SetSpacing( spacing );
78  img->SetOrigin( orig );
79  img->Allocate();
80 
81  // copy direction matrix
82  typename itk::Image< T, 3 >::DirectionType dirMat;
83  dirMat( 0, 0 ) = grid->getDirectionX()[ 0 ];
84  dirMat( 0, 1 ) = grid->getDirectionY()[ 0 ];
85  dirMat( 0, 2 ) = grid->getDirectionZ()[ 0 ];
86  dirMat( 1, 0 ) = grid->getDirectionX()[ 1 ];
87  dirMat( 1, 1 ) = grid->getDirectionY()[ 1 ];
88  dirMat( 1, 2 ) = grid->getDirectionZ()[ 1 ];
89  dirMat( 2, 0 ) = grid->getDirectionX()[ 2 ];
90  dirMat( 2, 1 ) = grid->getDirectionY()[ 2 ];
91  dirMat( 2, 2 ) = grid->getDirectionZ()[ 2 ];
92 
93  img->SetDirection( dirMat );
94 
95  for( i[ 0 ] = 0; i[ 0 ] < static_cast< int >( s[ 0 ] ); ++i[ 0 ] )
96  {
97  for( i[ 1 ] = 0; i[ 1 ] < static_cast< int >( s[ 1 ] ); ++i[ 1 ] )
98  {
99  for( i[ 2 ] = 0; i[ 2 ] < static_cast< int >( s[ 2 ] ); ++i[ 2 ] )
100  {
101  img->SetPixel( i, dataSet->getValueAt< T >( i[ 0 ], i[ 1 ], i[ 2 ] ) );
102  }
103  }
104  }
105  return img;
106 }
107 
108 /**
109  * Create a dataset from an itk image.
110  *
111  * \param img The image to convert.
112  *
113  * \return A pointer to the dataset.
114  */
115 template< typename T >
116 std::shared_ptr< WDataSetScalar > makeDataSetFromImage( typename itk::Image< T, 3 >::Pointer img )
117 {
118  typename itk::Image< T, 3 >::SizeType const& s = img->GetLargestPossibleRegion().GetSize();
119 
120  WMatrix< double > smat( 4, 4 );
121  typename itk::Image< T, 3 >::DirectionType dirMat = img->GetDirection();
122 
123  smat( 0, 0 ) = dirMat( 0, 0 );
124  smat( 0, 1 ) = dirMat( 0, 1 );
125  smat( 0, 2 ) = dirMat( 0, 2 );
126  smat( 1, 0 ) = dirMat( 1, 0 );
127  smat( 1, 1 ) = dirMat( 1, 1 );
128  smat( 1, 2 ) = dirMat( 1, 2 );
129  smat( 2, 0 ) = dirMat( 2, 0 );
130  smat( 2, 1 ) = dirMat( 2, 1 );
131  smat( 2, 2 ) = dirMat( 2, 2 );
132  smat( 0, 3 ) = img->GetOrigin()[ 0 ];
133  smat( 1, 3 ) = img->GetOrigin()[ 1 ];
134  smat( 2, 3 ) = img->GetOrigin()[ 2 ];
135  smat( 3, 3 ) = 1.0;
136  smat( 3, 0 ) = 0.0;
137  smat( 3, 1 ) = 0.0;
138  smat( 3, 2 ) = 0.0;
139 
140  WGridTransformOrtho t( smat );
141  std::shared_ptr< WGrid > grid( new WGridRegular3D( s[ 0 ], s[ 1 ], s[ 2 ], t ) );
142  std::shared_ptr< std::vector< T > > v( new std::vector< T >( s[ 0 ] * s[ 1 ] * s[ 2 ] ) );
143 
144  typename itk::Image< T, 3 >::IndexType i;
145 
146  for( i[ 0 ] = 0; i[ 0 ] < static_cast< int >( s[ 0 ] ); ++i[ 0 ] )
147  {
148  for( i[ 1 ] = 0; i[ 1 ] < static_cast< int >( s[ 1 ] ); ++i[ 1 ] )
149  {
150  for( i[ 2 ] = 0; i[ 2 ] < static_cast< int >( s[ 2 ] ); ++i[ 2 ] )
151  {
152  v->at( i[ 0 ] + i[ 1 ] * s[ 0 ] + i[ 2 ] * s[ 0 ] * s[ 1 ] ) = img->GetPixel( i );
153  }
154  }
155  }
156 
157  std::shared_ptr< WValueSetBase > values( new WValueSet< T >( 0, 1, v, DataType< T >::type ) );
158 
159  return std::shared_ptr< WDataSetScalar >( new WDataSetScalar( values, grid ) );
160 }
161 
162 #endif // OW_USE_ITK
163 
164 #endif // WITKIMAGECONVERSION_H
This data set type contains scalars as values.
A grid that has parallelepiped cells which all have the same proportion.
Implements an orthogonal grid transformation.
Base Class for all value set types.
Definition: WValueSet.h:47
An object that knows an appropriate dataType flag for the typename T.