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