OpenWalnut  1.4.0
WITKImageConversion.h
00001 //---------------------------------------------------------------------------
00002 //
00003 // Project: OpenWalnut ( http://www.openwalnut.org )
00004 //
00005 // Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
00006 // For more information see http://www.openwalnut.org/copying
00007 //
00008 // This file is part of OpenWalnut.
00009 //
00010 // OpenWalnut is free software: you can redistribute it and/or modify
00011 // it under the terms of the GNU Lesser General Public License as published by
00012 // the Free Software Foundation, either version 3 of the License, or
00013 // (at your option) any later version.
00014 //
00015 // OpenWalnut is distributed in the hope that it will be useful,
00016 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018 // GNU Lesser General Public License for more details.
00019 //
00020 // You should have received a copy of the GNU Lesser General Public License
00021 // along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
00022 //
00023 //---------------------------------------------------------------------------
00024 
00025 #ifndef WITKIMAGECONVERSION_H
00026 #define WITKIMAGECONVERSION_H
00027 
00028 #ifdef OW_USE_ITK
00029 #include <itkImage.h>
00030 #endif
00031 
00032 #include <vector>
00033 
00034 #include <boost/shared_ptr.hpp>
00035 
00036 #include "WDataSetScalar.h"
00037 
00038 #ifdef OW_USE_ITK
00039 
00040 /**
00041  * Create an itk image from a dataset.
00042  *
00043  * \param dataSet The dataset to convert.
00044  *
00045  * \return A pointer to a 3D itk image.
00046  */
00047 template< typename T >
00048 typename itk::Image< T, 3 >::Pointer makeImageFromDataSet( boost::shared_ptr< WDataSetScalar const > dataSet )
00049 {
00050     boost::shared_ptr< WGridRegular3D > grid = boost::dynamic_pointer_cast< WGridRegular3D >( dataSet->getGrid() );
00051     WAssert( grid, "" );
00052 
00053     // this is a shared-pointer
00054     typename itk::Image< T, 3 >::Pointer img = itk::Image< T, 3 >::New();
00055     typename itk::Image< T, 3 >::IndexType i;
00056     typename itk::Image< T, 3 >::SizeType s;
00057 
00058     s[ 0 ] = grid->getNbCoordsX();
00059     s[ 1 ] = grid->getNbCoordsY();
00060     s[ 2 ] = grid->getNbCoordsZ();
00061     i[ 0 ] = i[ 1 ] = i[ 2 ] = 0;
00062 
00063     typename itk::Image< T, 3 >::RegionType r;
00064     r.SetSize( s );
00065     r.SetIndex( i );
00066 
00067     typename itk::Image< T, 3 >::SpacingType spacing;
00068     spacing[ 0 ] = grid->getOffsetX();
00069     spacing[ 1 ] = grid->getOffsetY();
00070     spacing[ 2 ] = grid->getOffsetZ();
00071 
00072     typename itk::Image< T, 3 >::PointType orig;
00073     orig[ 0 ] = grid->getOrigin()[ 0 ];
00074     orig[ 1 ] = grid->getOrigin()[ 1 ];
00075     orig[ 2 ] = grid->getOrigin()[ 2 ];
00076 
00077     img->SetRegions( r );
00078     img->SetSpacing( spacing );
00079     img->SetOrigin( orig );
00080     img->Allocate();
00081 
00082     // copy direction matrix
00083     typename itk::Image< T, 3 >::DirectionType dirMat;
00084     dirMat( 0, 0 ) = grid->getDirectionX()[ 0 ];
00085     dirMat( 0, 1 ) = grid->getDirectionY()[ 0 ];
00086     dirMat( 0, 2 ) = grid->getDirectionZ()[ 0 ];
00087     dirMat( 1, 0 ) = grid->getDirectionX()[ 1 ];
00088     dirMat( 1, 1 ) = grid->getDirectionY()[ 1 ];
00089     dirMat( 1, 2 ) = grid->getDirectionZ()[ 1 ];
00090     dirMat( 2, 0 ) = grid->getDirectionX()[ 2 ];
00091     dirMat( 2, 1 ) = grid->getDirectionY()[ 2 ];
00092     dirMat( 2, 2 ) = grid->getDirectionZ()[ 2 ];
00093 
00094     img->SetDirection( dirMat );
00095 
00096     for( i[ 0 ] = 0; i[ 0 ] < static_cast< int >( s[ 0 ] ); ++i[ 0 ] )
00097     {
00098         for( i[ 1 ] = 0; i[ 1 ] < static_cast< int >( s[ 1 ] ); ++i[ 1 ] )
00099         {
00100             for( i[ 2 ] = 0; i[ 2 ] < static_cast< int >( s[ 2 ] ); ++i[ 2 ] )
00101             {
00102                 img->SetPixel( i, dataSet->getValueAt< T >( i[ 0 ], i[ 1 ], i[ 2 ] ) );
00103             }
00104         }
00105     }
00106     return img;
00107 }
00108 
00109 /**
00110  * Create a dataset from an itk image.
00111  *
00112  * \param img The image to convert.
00113  *
00114  * \return A pointer to the dataset.
00115  */
00116 template< typename T >
00117 boost::shared_ptr< WDataSetScalar > makeDataSetFromImage( typename itk::Image< T, 3 >::Pointer img )
00118 {
00119     typename itk::Image< T, 3 >::SizeType const& s = img->GetLargestPossibleRegion().GetSize();
00120 
00121     WMatrix< double > smat( 4, 4 );
00122     typename itk::Image< T, 3 >::DirectionType dirMat = img->GetDirection();
00123 
00124     smat( 0, 0 ) = dirMat( 0, 0 );
00125     smat( 0, 1 ) = dirMat( 0, 1 );
00126     smat( 0, 2 ) = dirMat( 0, 2 );
00127     smat( 1, 0 ) = dirMat( 1, 0 );
00128     smat( 1, 1 ) = dirMat( 1, 1 );
00129     smat( 1, 2 ) = dirMat( 1, 2 );
00130     smat( 2, 0 ) = dirMat( 2, 0 );
00131     smat( 2, 1 ) = dirMat( 2, 1 );
00132     smat( 2, 2 ) = dirMat( 2, 2 );
00133     smat( 0, 3 ) = img->GetOrigin()[ 0 ];
00134     smat( 1, 3 ) = img->GetOrigin()[ 1 ];
00135     smat( 2, 3 ) = img->GetOrigin()[ 2 ];
00136     smat( 3, 3 ) = 1.0;
00137     smat( 3, 0 ) = 0.0;
00138     smat( 3, 1 ) = 0.0;
00139     smat( 3, 2 ) = 0.0;
00140 
00141     WGridTransformOrtho t( smat );
00142     boost::shared_ptr< WGrid > grid( new WGridRegular3D( s[ 0 ], s[ 1 ], s[ 2 ], t ) );
00143     boost::shared_ptr< std::vector< T > > v( new std::vector< T >( s[ 0 ] * s[ 1 ] * s[ 2 ] ) );
00144 
00145     typename itk::Image< T, 3 >::IndexType i;
00146 
00147     for( i[ 0 ] = 0; i[ 0 ] < static_cast< int >( s[ 0 ] ); ++i[ 0 ] )
00148     {
00149         for( i[ 1 ] = 0; i[ 1 ] < static_cast< int >( s[ 1 ] ); ++i[ 1 ] )
00150         {
00151             for( i[ 2 ] = 0; i[ 2 ] < static_cast< int >( s[ 2 ] ); ++i[ 2 ] )
00152             {
00153                 v->at( i[ 0 ] + i[ 1 ] * s[ 0 ] + i[ 2 ] * s[ 0 ] * s[ 1 ] ) = img->GetPixel( i );
00154             }
00155         }
00156     }
00157 
00158     boost::shared_ptr< WValueSetBase > values( new WValueSet< T >( 0, 1, v, DataType< T >::type ) );
00159 
00160     return boost::shared_ptr< WDataSetScalar >( new WDataSetScalar( values, grid ) );
00161 }
00162 
00163 #endif  // OW_USE_ITK
00164 
00165 #endif  // WITKIMAGECONVERSION_H