itkwrapper.h 5.21 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// ================================================================================================
// 
// This file is part of the CAMPVis Software Framework.
// 
// If not explicitly stated otherwise: Copyright (C) 2012, all rights reserved,
//      Christian Schulte zu Berge <christian.szb@in.tum.de>
//      Chair for Computer Aided Medical Procedures
//      Technische Universitt Mnchen
//      Boltzmannstr. 3, 85748 Garching b. Mnchen, Germany
// For a full list of authors and contributors, please refer to the file "AUTHORS.txt".
// 
// The licensing of this softare is not yet resolved. Until then, redistribution in source or
// binary forms outside the CAMP chair is not permitted, unless explicitly stated in legal form.
// However, the names of the original authors and the above copyright notice must retain in its
// original state in any case.
// 
// Legal disclaimer provided by the BSD license:
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 
// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
// 
// ================================================================================================

#ifndef ITKWRAPPER_H__
#define ITKWRAPPER_H__

#include "tgt/assert.h"

#include "core/tools/typetraits.h"
#include "core/datastructures/imagedata.h"
#include "core/datastructures/imagerepresentationlocal.h"
#include "core/datastructures/genericimagerepresentationlocal.h"

40
41
42
43
44
#include <itkImage.h>
#include <itkImportImageFilter.h>
#include <itkImageRegionConstIterator.h>
#include <itkRGBPixel.h>

45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <cstring> // memcpy

namespace campvis {

    class ItkWrapper {
    public:
        template<typename T>
        static typename itk::Image<T, 3>::Pointer convertImageFromCampvisToItk(const ImageData* image);

        template<typename T>
        static ImageData* convertImageFromItkToCampvis(const typename itk::Image<T, 3>::Pointer image);
    };

// ================================================================================================

    template<typename T>
61
    typename itk::Image<T, 3>::Pointer ItkWrapper::convertImageFromCampvisToItk(const ImageData* image) {
62
63
64
65
66
67
        tgtAssert(image != 0, "Image must not be 0.");

        const GenericImageRepresentationLocal<T, 1>* representation = image->getRepresentation< GenericImageRepresentationLocal<T, 1> >();
        if (representation == 0)
            return 0;

68
        typename itk::ImportImageFilter<T, 3>::Pointer importer = itk::ImportImageFilter<T, 3>::New();
69

70
        typename itk::Image<T, 3>::SizeType size;
71
72
73
74
        size[0] = image->getSize().x;
        size[1] = image->getSize().y;
        size[2] = image->getSize().z;

75
        typename itk::Image<T, 3>::IndexType start;
76
77
        start.Fill(0);

78
        typename itk::Image<T, 3>::RegionType region;
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
        region.SetSize(size);
        region.SetIndex(start);
        importer->SetRegion(region);

        importer->SetSpacing(image->getMappingInformation().getVoxelSize().elem);
        importer->SetOrigin(image->getMappingInformation().getOffset().elem);

        typedef typename itk::Image<T, 3>::PixelType PixelType;
        const PixelType* pixelData = representation->getImageData();
        importer->SetImportPointer(const_cast<PixelType*>(pixelData), image->getNumElements(), false);
        importer->Update();

        return importer->GetOutput();
    }

    template<typename T>
    ImageData* campvis::ItkWrapper::convertImageFromItkToCampvis(const typename itk::Image<T, 3>::Pointer image) {
        typedef typename itk::Image<T, 3>::PixelType PixelType;
        const PixelType* pixelData = image->GetBufferPointer();

99
        typename itk::Image<T, 3>::RegionType region;
100
101
        region = image->GetBufferedRegion();

102
        typename itk::Image<T, 3>::SizeType s = region.GetSize();
103
104
        tgt::svec3 size(s[0], s[1], s[2]);

105
        typename itk::Image<T, 3>::SpacingType sp = image->GetSpacing();
106
107
        tgt::vec3 spacing(sp[0], sp[1], sp[2]);

108
        typename itk::Image<T, 3>::PointType o = image->GetOrigin();
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
        tgt::vec3 offset(o[0], o[1], o[2]);

        ImageData* toReturn = new ImageData(3, size, 1);
        toReturn->setMappingInformation(ImageMappingInformation(size, offset, spacing));

        PixelType* pixelDataCopy = new PixelType[toReturn->getNumElements()];
        memcpy(pixelDataCopy, pixelData, toReturn->getNumElements() * TypeTraits<T, 1>::elementSize);

        new GenericImageRepresentationLocal<PixelType, 1>(toReturn, pixelDataCopy);

        return toReturn;
    }

}

#endif // ITKWRAPPER_H__