Medical Imaging Interaction Toolkit  2026.06.00
Medical Imaging Interaction Toolkit
mitkConvolutionHelper.h
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 #ifndef mitkConvolutionHelper_h
13 #define mitkConvolutionHelper_h
14 
15 #include <itkArray.h>
16 #include <mitkAIFBasedModelBase.h>
17 #include <iostream>
19 
20 namespace mitk {
28  namespace convolution {
29 
36 inline itk::Array<double> wrap1d(itk::Array<double> kernel)
37  {
38  int dim = kernel.GetNumberOfElements();
39  itk::Array<double> wrappedKernel(dim);
40  wrappedKernel.fill(0.);
41  for(int i=0; i< dim; ++i)
42  {
43  wrappedKernel.SetElement(i, kernel.GetElement((i+(dim/2))%dim));
44  }
45 
46  return wrappedKernel;
47  }
48 
56  inline itk::Array<double> zeropadding1d(itk::Array<double> unpaddedSpectrum, int paddedDimension)
57  {
58 
59  int initialDimension = unpaddedSpectrum.GetNumberOfElements();
60 
61  itk::Array<double> paddedSpectrum(paddedDimension);
62  paddedSpectrum.fill(0.);
63 
64  if(paddedDimension > initialDimension)
65  {
66  unsigned int padding = paddedDimension - initialDimension;
67 
68  for(int i=0; i<initialDimension ;++i)
69  {
70  paddedSpectrum.SetElement(i+padding/2, unpaddedSpectrum.GetElement(i));
71  }
72  }
73  return paddedSpectrum;
74  }
75 
84  inline itk::Array<double> unpadAndScale(itk::Array<double> convolutionResult, int initialDimension)
85  {
86  int transformationDimension = convolutionResult.size();
87  unsigned int padding = transformationDimension - initialDimension;
88 
89  itk::Array<double> scaledResult(initialDimension);
90  scaledResult.fill(0.0);
91 
92  for(int i = 0; i<initialDimension; ++i)
93  {
94  double value = convolutionResult(i+padding/2) / transformationDimension;
95  scaledResult.SetElement(i,value);
96  }
97  return scaledResult;
98  }
107  inline void prepareConvolution(const itk::Array<double>& kernel, const itk::Array<double>& spectrum, itk::Array<double>& preparedKernel, itk::Array<double>& preparedSpectrum ){
108  int convolutionDimensions = kernel.GetSize() + spectrum.GetSize();
109 
110 // itk::Array<double> paddedKernel = zeropadding1d(kernel,convolutionDimensions);
111  preparedKernel=zeropadding1d(kernel,convolutionDimensions);
112 
113  preparedSpectrum = zeropadding1d(spectrum,convolutionDimensions);
114 // preparedKernel = wrap1d(paddedKernel);
115  }
116 
117  }
118 
130  {
131  typedef itk::Array<double> ConvolutionResultType;
132  ConvolutionResultType convolution(timeGrid.GetSize());
133  convolution.fill(0.0);
134 
135  convolution(0) = 0;
136  for(unsigned int i = 0; i< (timeGrid.GetSize()-1); ++i)
137  {
138  double dt = timeGrid(i+1) - timeGrid(i);
139  double m = (aif(i+1) - aif(i))/dt;
140  double edt = exp(-lambda *dt);
141 
142  convolution(i+1) =edt * convolution(i)
143  + (aif(i) - m*timeGrid(i))/lambda * (1 - edt )
144  + m/(lambda * lambda) * ((lambda * timeGrid(i+1) - 1) - edt*(lambda*timeGrid(i) -1));
145 
146  }
147  return convolution;
148  }
149 
150 
162  {
163  typedef itk::Array<double> ConvolutionResultType;
164  ConvolutionResultType convolution(timeGrid.GetSize());
165  convolution.fill(0.0);
166 
167  convolution(0) = 0;
168  for(unsigned int i = 0; i< (timeGrid.GetSize()-1); ++i)
169  {
170  double dt = timeGrid(i+1) - timeGrid(i);
171  double m = (aif(i+1) - aif(i))/dt;
172 
173  convolution(i+1) = convolution(i) + constant * (aif(i)*dt + m*timeGrid(i)*dt + m/2*(timeGrid(i+1)*timeGrid(i+1) - timeGrid(i)*timeGrid(i)));
174 
175  }
176  return convolution;
177  }
178 
179 }
180 
181 #endif
itk::Array< double > AterialInputFunctionType
Array type for the Arterial Input Function AIF(t).
itk::Array< double > TimeGridType
Type defining the time grid used by models.
Definition: mitkModelBase.h:70
itk::Array< double > zeropadding1d(itk::Array< double > unpaddedSpectrum, int paddedDimension)
Zero-pads a 1D array to a specified size.
void prepareConvolution(const itk::Array< double > &kernel, const itk::Array< double > &spectrum, itk::Array< double > &preparedKernel, itk::Array< double > &preparedSpectrum)
Prepares two arrays for FFT-based convolution.
itk::Array< double > unpadAndScale(itk::Array< double > convolutionResult, int initialDimension)
Removes padding and scales the result after inverse FFT.
itk::Array< double > wrap1d(itk::Array< double > kernel)
Wraps (circularly shifts) a 1D convolution kernel.
Find image slices visible on a given plane.
itk::Array< double > convoluteAIFWithExponential(mitk::ModelBase::TimeGridType timeGrid, mitk::AIFBasedModelBase::AterialInputFunctionType aif, double lambda)
Convolves the AIF with an exponential residue function using an iterative formula.
itk::Array< double > convoluteAIFWithConstant(mitk::ModelBase::TimeGridType timeGrid, mitk::AIFBasedModelBase::AterialInputFunctionType aif, double constant)
Convolves the AIF with a constant value using an iterative formula.