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::dynamic_pointer_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(
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
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.