STIR 6.4.0
transform_3d_object.inl
Go to the documentation of this file.
1//
2//
3/*
4 Copyright (C) 2005- 2005, Hammersmith Imanet Ltd
5 For internal GE use only.
6*/
15
18#include "stir/Succeeded.h"
19START_NAMESPACE_STIR
20
21template <class ObjectTransformationT, class PushInterpolatorT>
22Succeeded
24 const DiscretisedDensity<3, float>& in_density,
25 const ObjectTransformationT& transformation_in_to_out,
26 const PushInterpolatorT& interpolator,
27 const bool do_jacobian)
28{
29
30 const VoxelsOnCartesianGrid<float>& in_image = dynamic_cast<VoxelsOnCartesianGrid<float> const&>(in_density);
31 VoxelsOnCartesianGrid<float>& out_image = dynamic_cast<VoxelsOnCartesianGrid<float>&>(out_density);
32
33 interpolator.set_output(out_image);
34
35 for (int z = in_image.get_min_index(); z <= in_image.get_max_index(); ++z)
36 for (int y = in_image[z].get_min_index(); y <= in_image[z].get_max_index(); ++y)
37 for (int x = in_image[z][y].get_min_index(); x <= in_image[z][y].get_max_index(); ++x)
38 {
39 const CartesianCoordinate3D<float> current_point
40 = CartesianCoordinate3D<float>(z, y, x) * in_image.get_voxel_size() + in_image.get_origin();
41 const CartesianCoordinate3D<float> new_point = transformation_in_to_out.transform_point(current_point);
42 const CartesianCoordinate3D<float> new_point_in_image_coords
43 = (new_point - out_image.get_origin()) / out_image.get_voxel_size();
44 const float jacobian = do_jacobian ? transformation_in_to_out.jacobian(current_point) : 1;
45 interpolator.add_to(new_point_in_image_coords, in_image[z][y][x] * jacobian);
46 }
47 return Succeeded::yes;
48}
49
50template <class ObjectTransformationT, class PullInterpolatorT>
51Succeeded
53 const DiscretisedDensity<3, float>& in_density,
54 const ObjectTransformationT& transformation_out_to_in,
55 const PullInterpolatorT& interpolator,
56 const bool do_jacobian)
57{
58
59 const VoxelsOnCartesianGrid<float>& in_image = dynamic_cast<VoxelsOnCartesianGrid<float> const&>(in_density);
60 VoxelsOnCartesianGrid<float>& out_image = dynamic_cast<VoxelsOnCartesianGrid<float>&>(out_density);
61
62 interpolator.set_input(in_density);
63
64 for (int z = out_image.get_min_index(); z <= out_image.get_max_index(); ++z)
65 for (int y = out_image[z].get_min_index(); y <= out_image[z].get_max_index(); ++y)
66 for (int x = out_image[z][y].get_min_index(); x <= out_image[z][y].get_max_index(); ++x)
67 {
68 const CartesianCoordinate3D<float> current_point
69 = CartesianCoordinate3D<float>(static_cast<float>(z), static_cast<float>(y), static_cast<float>(x))
70 * out_image.get_voxel_size()
71 + out_image.get_origin();
72 const CartesianCoordinate3D<float> new_point = transformation_out_to_in.transform_point(current_point);
73 const CartesianCoordinate3D<float> new_point_in_image_coords
74 = (new_point - in_image.get_origin()) / in_image.get_voxel_size();
75 out_image[z][y][x] = interpolator(new_point_in_image_coords);
76 if (do_jacobian)
77 out_image[z][y][x] *= transformation_out_to_in.jacobian(current_point);
78 }
79
80 return Succeeded::yes;
81}
82
83END_NAMESPACE_STIR
defines the stir::CartesianCoordinate3D<coordT> class
Declaration of class stir::Succeeded.
defines the stir::VoxelsOnCartesianGrid class
a templated class for 3-dimensional coordinates.
Definition CartesianCoordinate3D.h:53
This abstract class is the basis for all image representations.
Definition DiscretisedDensity.h:99
const CartesianCoordinate3D< float > & get_origin() const
Return the origin.
Definition DiscretisedDensity.inl:64
int get_max_index() const
get value of last valid index
Definition VectorWithOffset.inl:131
int get_min_index() const
get value of first valid index
Definition VectorWithOffset.inl:124
This class is used to represent voxelised densities on a cuboid grid (3D).
Definition VoxelsOnCartesianGrid.h:46
CartesianCoordinate3D< float > get_voxel_size() const
is the same as get_grid_spacing(), but now returns CartesianCoordinate3D for convenience
Definition VoxelsOnCartesianGrid.inl:27
Succeeded transform_3d_object_pull_interpolation(DiscretisedDensity< 3, float > &out_density, const DiscretisedDensity< 3, float > &in_density, const ObjectTransformationT &transformation_out_to_in, const PullInterpolatorT &interpolator, const bool do_jacobian)
transform image data
Definition transform_3d_object.inl:52
Succeeded transform_3d_object_push_interpolation(DiscretisedDensity< 3, float > &out_density, const DiscretisedDensity< 3, float > &in_density, const ObjectTransformationT &transformation_in_to_out, const PushInterpolatorT &interpolator, const bool do_jacobian)
transform image data
Definition transform_3d_object.inl:23