25 #ifndef WITKIMAGECONVERSION_H
26 #define WITKIMAGECONVERSION_H
35 #include <boost/shared_ptr.hpp>
38 #include "WDataSetScalar.h"
49 template<
typename T >
50 typename itk::Image< T, 3 >::Pointer makeImageFromDataSet( boost::shared_ptr< WDataSetScalar const > dataSet )
52 boost::shared_ptr< WGridRegular3D > grid = boost::dynamic_pointer_cast<
WGridRegular3D >( dataSet->getGrid() );
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;
60 s[ 0 ] = grid->getNbCoordsX();
61 s[ 1 ] = grid->getNbCoordsY();
62 s[ 2 ] = grid->getNbCoordsZ();
63 i[ 0 ] = i[ 1 ] = i[ 2 ] = 0;
65 typename itk::Image< T, 3 >::RegionType r;
69 typename itk::Image< T, 3 >::SpacingType spacing;
70 spacing[ 0 ] = grid->getOffsetX();
71 spacing[ 1 ] = grid->getOffsetY();
72 spacing[ 2 ] = grid->getOffsetZ();
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 ];
80 img->SetSpacing( spacing );
81 img->SetOrigin( orig );
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 ];
96 img->SetDirection( dirMat );
98 for( i[ 0 ] = 0; i[ 0 ] <
static_cast< int >( s[ 0 ] ); ++i[ 0 ] )
100 for( i[ 1 ] = 0; i[ 1 ] <
static_cast< int >( s[ 1 ] ); ++i[ 1 ] )
102 for( i[ 2 ] = 0; i[ 2 ] <
static_cast< int >( s[ 2 ] ); ++i[ 2 ] )
104 img->SetPixel( i, dataSet->getValueAt< T >( i[ 0 ], i[ 1 ], i[ 2 ] ) );
118 template<
typename T >
119 boost::shared_ptr< WDataSetScalar > makeDataSetFromImage(
typename itk::Image< T, 3 >::Pointer img )
121 typename itk::Image< T, 3 >::SizeType
const& s = img->GetLargestPossibleRegion().GetSize();
124 typename itk::Image< T, 3 >::DirectionType dirMat = img->GetDirection();
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 ];
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 ] ) );
147 typename itk::Image< T, 3 >::IndexType i;
149 for( i[ 0 ] = 0; i[ 0 ] <
static_cast< int >( s[ 0 ] ); ++i[ 0 ] )
151 for( i[ 1 ] = 0; i[ 1 ] <
static_cast< int >( s[ 1 ] ); ++i[ 1 ] )
153 for( i[ 2 ] = 0; i[ 2 ] <
static_cast< int >( s[ 2 ] ); ++i[ 2 ] )
155 v->at( i[ 0 ] + i[ 1 ] * s[ 0 ] + i[ 2 ] * s[ 0 ] * s[ 1 ] ) = img->GetPixel( i );
162 return boost::shared_ptr< WDataSetScalar >(
new WDataSetScalar( values, grid ) );
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.
This data set type contains scalars as values.