RTK  2.7.0
Reconstruction Toolkit
rtkZengForwardProjectionImageFilter.h
Go to the documentation of this file.
1 /*=========================================================================
2  *
3  * Copyright RTK Consortium
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * https://www.apache.org/licenses/LICENSE-2.0.txt
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *=========================================================================*/
18 
19 #ifndef rtkZengForwardProjectionImageFilter_h
20 #define rtkZengForwardProjectionImageFilter_h
21 
22 #include "rtkConfiguration.h"
24 #include "rtkMacro.h"
25 #include <itkPixelTraits.h>
26 
27 #include <itkMultiplyImageFilter.h>
28 #include <itkAddImageFilter.h>
29 #include <itkDiscreteGaussianImageFilter.h>
30 #include <itkPasteImageFilter.h>
31 #include <itkResampleImageFilter.h>
32 #include <itkVector.h>
33 #include <itkCenteredEuler3DTransform.h>
34 #include <itkChangeInformationImageFilter.h>
35 #include <itkRegionOfInterestImageFilter.h>
36 #include <itkConstantBoundaryCondition.h>
37 #include <itkUnaryGeneratorImageFilter.h>
38 
39 #include <itkVectorImage.h>
40 namespace rtk
41 {
42 
61 template <class TInputImage, class TOutputImage>
62 class ITK_TEMPLATE_EXPORT ZengForwardProjectionImageFilter
63  : public ForwardProjectionImageFilter<TInputImage, TOutputImage>
64 {
65 public:
67  using VectorType = itk::Vector<double, 3>;
68  using InputPixelType = typename TInputImage::PixelType;
69  using OutputPixelType = typename TOutputImage::PixelType;
70  using OutputImageRegionType = typename TOutputImage::RegionType;
71  using InputCPUImageType = itk::Image<InputPixelType, 3>;
72  using OuputCPUImageType = itk::Image<OutputPixelType, 3>;
73  using PointType = typename InputCPUImageType::PointType;
74 
77  using Pointer = itk::SmartPointer<Self>;
78  using ConstPointer = itk::SmartPointer<const Self>;
79  using AddImageFilterType = itk::AddImageFilter<OuputCPUImageType, OuputCPUImageType>;
80  using AddImageFilterPointerType = typename AddImageFilterType::Pointer;
81  using PasteImageFilterType = itk::PasteImageFilter<OuputCPUImageType, InputCPUImageType>;
82  using PasteImageFilterPointerType = typename PasteImageFilterType::Pointer;
83  using DiscreteGaussianFilterType = itk::DiscreteGaussianImageFilter<OuputCPUImageType, OuputCPUImageType>;
84  using DiscreteGaussianFilterPointeurType = typename DiscreteGaussianFilterType::Pointer;
85  using ResampleImageFilterType = itk::ResampleImageFilter<OuputCPUImageType, OuputCPUImageType>;
86  using ResampleImageFilterPointerType = typename ResampleImageFilterType::Pointer;
87  using TransformType = itk::CenteredEuler3DTransform<double>;
88  using TransformPointerType = typename TransformType::Pointer;
89  using ChangeInformationFilterType = itk::ChangeInformationImageFilter<OuputCPUImageType>;
90  using ChangeInformationPointerType = typename ChangeInformationFilterType::Pointer;
91  using RegionOfInterestFilterType = itk::RegionOfInterestImageFilter<OuputCPUImageType, OuputCPUImageType>;
92  using RegionOfInterestPointerType = typename RegionOfInterestFilterType::Pointer;
93  using MultiplyImageFilterType = itk::MultiplyImageFilter<OuputCPUImageType, OuputCPUImageType>;
94  using MultpiplyImageFilterPointerType = typename MultiplyImageFilterType::Pointer;
95  using CustomUnaryFilterType = itk::UnaryGeneratorImageFilter<OuputCPUImageType, OuputCPUImageType>;
96  using CustomUnaryFilterPointerType = typename CustomUnaryFilterType::Pointer;
97 
99  static constexpr unsigned int InputImageDimension = TOutputImage::ImageDimension;
100 
102  using BoundaryCondition = itk::ConstantBoundaryCondition<OuputCPUImageType>;
103 
105  itkNewMacro(Self);
106 
108  itkOverrideGetNameOfClassMacro(ZengForwardProjectionImageFilter);
109 
111  itkGetMacro(SigmaZero, double);
112  itkSetMacro(SigmaZero, double);
114 
116  itkGetMacro(Alpha, double);
117  itkSetMacro(Alpha, double);
119 
120 protected:
122  ~ZengForwardProjectionImageFilter() override = default;
123 
124  void
125  GenerateInputRequestedRegion() override;
126 
127  void
128  GenerateOutputInformation() override;
129 
130  void
131  GenerateData() override;
132 
135  void
136  VerifyInputInformation() const override;
137 
152 
153 
154 private:
155  ZengForwardProjectionImageFilter(const Self &) = delete; // purposely not implemented
156  void
157  operator=(const Self &) = delete; // purposely not implemented
158 
159  double m_SigmaZero{ 1.5417233052142099 };
160  double m_Alpha{ 0.016241189545787734 };
161  VectorType m_VectorOrthogonalDetector{ 0. };
162  PointType m_centerVolume{ 0 };
163 };
164 
165 } // end namespace rtk
166 
167 #ifndef ITK_MANUAL_INSTANTIATION
168 # include "rtkZengForwardProjectionImageFilter.hxx"
169 #endif
170 
171 #endif
itk::SmartPointer< const Self > ConstPointer
Base class for forward projection, i.e. accumulation along x-ray lines.
typename ResampleImageFilterType::Pointer ResampleImageFilterPointerType
typename TOutputImage::RegionType OutputImageRegionType
itk::ChangeInformationImageFilter< OuputCPUImageType > ChangeInformationFilterType
typename PasteImageFilterType::Pointer PasteImageFilterPointerType
itk::ConstantBoundaryCondition< OuputCPUImageType > BoundaryCondition
typename DiscreteGaussianFilterType::Pointer DiscreteGaussianFilterPointeurType
ResampleImageFilterPointerType m_AttenuationMapResampleImageFilter
itk::MultiplyImageFilter< OuputCPUImageType, OuputCPUImageType > MultiplyImageFilterType
itk::PasteImageFilter< OuputCPUImageType, InputCPUImageType > PasteImageFilterType
typename MultiplyImageFilterType::Pointer MultpiplyImageFilterPointerType
itk::RegionOfInterestImageFilter< OuputCPUImageType, OuputCPUImageType > RegionOfInterestFilterType
#define itkSetMacro(name, type)
itk::CenteredEuler3DTransform< double > TransformType
typename CustomUnaryFilterType::Pointer CustomUnaryFilterPointerType
typename AddImageFilterType::Pointer AddImageFilterPointerType
itk::UnaryGeneratorImageFilter< OuputCPUImageType, OuputCPUImageType > CustomUnaryFilterType
DiscreteGaussianFilterPointeurType m_DiscreteGaussianFilter
typename ChangeInformationFilterType::Pointer ChangeInformationPointerType
MultpiplyImageFilterPointerType m_AttenuationMapMultiplyImageFilter
itk::InPlaceImageFilter< TInputImage, TOutputImage > Superclass
itk::DiscreteGaussianImageFilter< OuputCPUImageType, OuputCPUImageType > DiscreteGaussianFilterType
itk::ResampleImageFilter< OuputCPUImageType, OuputCPUImageType > ResampleImageFilterType
typename RegionOfInterestFilterType::Pointer RegionOfInterestPointerType
typename InputCPUImageType::PointType PointType
itk::AddImageFilter< OuputCPUImageType, OuputCPUImageType > AddImageFilterType