25 #ifndef WITKIMAGECONVERSION_H
26 #define WITKIMAGECONVERSION_H
35 #include "WDataSetScalar.h"
46 template<
typename T >
47 typename itk::Image< T, 3 >::Pointer makeImageFromDataSet( std::shared_ptr< WDataSetScalar const > dataSet )
49 std::shared_ptr< WGridRegular3D > grid = std::dynamic_pointer_cast< WGridRegular3D >( dataSet->getGrid() );
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;
57 s[ 0 ] = grid->getNbCoordsX();
58 s[ 1 ] = grid->getNbCoordsY();
59 s[ 2 ] = grid->getNbCoordsZ();
60 i[ 0 ] = i[ 1 ] = i[ 2 ] = 0;
62 typename itk::Image< T, 3 >::RegionType r;
66 typename itk::Image< T, 3 >::SpacingType spacing;
67 spacing[ 0 ] = grid->getOffsetX();
68 spacing[ 1 ] = grid->getOffsetY();
69 spacing[ 2 ] = grid->getOffsetZ();
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 ];
77 img->SetSpacing( spacing );
78 img->SetOrigin( orig );
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 ];
93 img->SetDirection( dirMat );
95 for( i[ 0 ] = 0; i[ 0 ] <
static_cast< int >( s[ 0 ] ); ++i[ 0 ] )
97 for( i[ 1 ] = 0; i[ 1 ] <
static_cast< int >( s[ 1 ] ); ++i[ 1 ] )
99 for( i[ 2 ] = 0; i[ 2 ] <
static_cast< int >( s[ 2 ] ); ++i[ 2 ] )
101 img->SetPixel( i, dataSet->getValueAt< T >( i[ 0 ], i[ 1 ], i[ 2 ] ) );
115 template<
typename T >
116 std::shared_ptr< WDataSetScalar > makeDataSetFromImage(
typename itk::Image< T, 3 >::Pointer img )
118 typename itk::Image< T, 3 >::SizeType
const& s = img->GetLargestPossibleRegion().GetSize();
121 typename itk::Image< T, 3 >::DirectionType dirMat = img->GetDirection();
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 ];
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 ] ) );
144 typename itk::Image< T, 3 >::IndexType i;
146 for( i[ 0 ] = 0; i[ 0 ] <
static_cast< int >( s[ 0 ] ); ++i[ 0 ] )
148 for( i[ 1 ] = 0; i[ 1 ] <
static_cast< int >( s[ 1 ] ); ++i[ 1 ] )
150 for( i[ 2 ] = 0; i[ 2 ] <
static_cast< int >( s[ 2 ] ); ++i[ 2 ] )
152 v->at( i[ 0 ] + i[ 1 ] * s[ 0 ] + i[ 2 ] * s[ 0 ] * s[ 1 ] ) = img->GetPixel( i );
159 return std::shared_ptr< WDataSetScalar >(
new WDataSetScalar( values, grid ) );
This data set type contains scalars as values.
A grid that has parallelepiped cells which all have the same proportion.
Base Class for all value set types.
An object that knows an appropriate dataType flag for the typename T.