25 #ifndef WITKIMAGECONVERSION_H
26 #define WITKIMAGECONVERSION_H
34 #include <boost/shared_ptr.hpp>
36 #include "WDataSetScalar.h"
47 template<
typename T >
48 typename itk::Image< T, 3 >::Pointer makeImageFromDataSet( boost::shared_ptr< WDataSetScalar const > dataSet )
50 boost::shared_ptr< WGridRegular3D > grid = boost::shared_dynamic_cast<
WGridRegular3D >( dataSet->getGrid() );
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;
58 s[ 0 ] = grid->getNbCoordsX();
59 s[ 1 ] = grid->getNbCoordsY();
60 s[ 2 ] = grid->getNbCoordsZ();
61 i[ 0 ] = i[ 1 ] = i[ 2 ] = 0;
63 typename itk::Image< T, 3 >::RegionType r;
67 typename itk::Image< T, 3 >::SpacingType spacing;
68 spacing[ 0 ] = grid->getOffsetX();
69 spacing[ 1 ] = grid->getOffsetY();
70 spacing[ 2 ] = grid->getOffsetZ();
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 ];
78 img->SetSpacing( spacing );
79 img->SetOrigin( orig );
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 ];
94 img->SetDirection( dirMat );
96 for( i[ 0 ] = 0; i[ 0 ] <
static_cast< int >( s[ 0 ] ); ++i[ 0 ] )
98 for( i[ 1 ] = 0; i[ 1 ] <
static_cast< int >( s[ 1 ] ); ++i[ 1 ] )
100 for( i[ 2 ] = 0; i[ 2 ] <
static_cast< int >( s[ 2 ] ); ++i[ 2 ] )
102 img->SetPixel( i, dataSet->getValueAt<
T >( i[ 0 ], i[ 1 ], i[ 2 ] ) );
116 template<
typename T >
117 boost::shared_ptr< WDataSetScalar > makeDataSetFromImage(
typename itk::Image< T, 3 >::Pointer img )
119 typename itk::Image< T, 3 >::SizeType
const& s = img->GetLargestPossibleRegion().GetSize();
122 typename itk::Image< T, 3 >::DirectionType dirMat = img->GetDirection();
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 ];
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 ] ) );
145 typename itk::Image< T, 3 >::IndexType i;
147 for( i[ 0 ] = 0; i[ 0 ] <
static_cast< int >( s[ 0 ] ); ++i[ 0 ] )
149 for( i[ 1 ] = 0; i[ 1 ] <
static_cast< int >( s[ 1 ] ); ++i[ 1 ] )
151 for( i[ 2 ] = 0; i[ 2 ] <
static_cast< int >( s[ 2 ] ); ++i[ 2 ] )
153 v->at( i[ 0 ] + i[ 1 ] * s[ 0 ] + i[ 2 ] * s[ 0 ] * s[ 1 ] ) = img->GetPixel( i );
160 return boost::shared_ptr< WDataSetScalar >(
new WDataSetScalar( values, grid ) );
165 #endif // WITKIMAGECONVERSION_H