diff options
author | Willem Jan Palenstijn <wjp@usecode.org> | 2018-07-18 11:46:05 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-07-18 11:46:05 +0200 |
commit | 93612c333d6aa0f7d80bd286d9983ce5047a0fd8 (patch) | |
tree | e78ac8d69f659b7c9c59e121f7dfb9cba8e5004f /include/astra | |
parent | 0d06afc38d7a8443a079d25d72ec4b4b15353974 (diff) | |
parent | 4d741fc8e6c7930f7a8e27f54c55e0ad4949ed07 (diff) | |
download | astra-93612c333d6aa0f7d80bd286d9983ce5047a0fd8.tar.gz astra-93612c333d6aa0f7d80bd286d9983ce5047a0fd8.tar.bz2 astra-93612c333d6aa0f7d80bd286d9983ce5047a0fd8.tar.xz astra-93612c333d6aa0f7d80bd286d9983ce5047a0fd8.zip |
Merge pull request #160 from wjp/FBP_filters
Custom filter support for CPU FBP
Diffstat (limited to 'include/astra')
-rw-r--r-- | include/astra/CudaFilteredBackProjectionAlgorithm.h | 9 | ||||
-rw-r--r-- | include/astra/FilteredBackProjectionAlgorithm.h | 5 | ||||
-rw-r--r-- | include/astra/Filters.h (renamed from include/astra/cuda/2d/fbp_filters.h) | 43 | ||||
-rw-r--r-- | include/astra/cuda/2d/astra.h | 1 | ||||
-rw-r--r-- | include/astra/cuda/2d/fbp.h | 6 | ||||
-rw-r--r-- | include/astra/cuda/2d/fft.h | 10 |
6 files changed, 53 insertions, 21 deletions
diff --git a/include/astra/CudaFilteredBackProjectionAlgorithm.h b/include/astra/CudaFilteredBackProjectionAlgorithm.h index 1280e9a..8ef5a57 100644 --- a/include/astra/CudaFilteredBackProjectionAlgorithm.h +++ b/include/astra/CudaFilteredBackProjectionAlgorithm.h @@ -33,6 +33,7 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>. #include "Float32ProjectionData2D.h" #include "Float32VolumeData2D.h" #include "CudaReconstructionAlgorithm2D.h" +#include "Filters.h" #include "cuda/2d/astra.h" @@ -45,15 +46,9 @@ public: static std::string type; private: - E_FBPFILTER m_eFilter; - float * m_pfFilter; - int m_iFilterWidth; // number of elements per projection direction in filter - float m_fFilterParameter; // some filters allow for parameterization (value < 0.0f -> no parameter) - float m_fFilterD; // frequency cut-off + SFilterConfig m_filterConfig; bool m_bShortScan; // short-scan mode for fan beam - static E_FBPFILTER _convertStringToFilter(const char * _filterType); - public: CCudaFilteredBackProjectionAlgorithm(); virtual ~CCudaFilteredBackProjectionAlgorithm(); diff --git a/include/astra/FilteredBackProjectionAlgorithm.h b/include/astra/FilteredBackProjectionAlgorithm.h index 1cd4296..a234845 100644 --- a/include/astra/FilteredBackProjectionAlgorithm.h +++ b/include/astra/FilteredBackProjectionAlgorithm.h @@ -35,6 +35,7 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>. #include "Projector2D.h" #include "Float32ProjectionData2D.h" #include "Float32VolumeData2D.h" +#include "Filters.h" namespace astra { @@ -144,6 +145,10 @@ public: */ virtual std::string description() const; +protected: + + SFilterConfig m_filterConfig; + }; // inline functions diff --git a/include/astra/cuda/2d/fbp_filters.h b/include/astra/Filters.h index 7c1121a..a1dec97 100644 --- a/include/astra/cuda/2d/fbp_filters.h +++ b/include/astra/Filters.h @@ -25,13 +25,18 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>. ----------------------------------------------------------------------- */ -#ifndef FBP_FILTERS_H -#define FBP_FILTERS_H +#ifndef _INC_ASTRA_FILTERS_H +#define _INC_ASTRA_FILTERS_H namespace astra { +struct Config; +class CAlgorithm; +class CProjectionGeometry2D; + enum E_FBPFILTER { + FILTER_ERROR, //< not a valid filter FILTER_NONE, //< no filter (regular BP) FILTER_RAMLAK, //< default FBP filter FILTER_SHEPPLOGAN, //< Shepp-Logan @@ -54,8 +59,40 @@ enum E_FBPFILTER FILTER_SINOGRAM, //< every projection direction has its own filter FILTER_RPROJECTION, //< projection filter in real space (as opposed to fourier space) FILTER_RSINOGRAM, //< sinogram filter in real space + }; +struct SFilterConfig { + E_FBPFILTER m_eType; + float m_fD; + float m_fParameter; + + float *m_pfCustomFilter; + int m_iCustomFilterWidth; + int m_iCustomFilterHeight; + + SFilterConfig() : m_eType(FILTER_ERROR), m_fD(1.0f), m_fParameter(-1.0f), + m_pfCustomFilter(0), m_iCustomFilterWidth(0), + m_iCustomFilterHeight(0) { }; +}; + +// Generate filter of given size and parameters. Returns newly allocated array. +float *genFilter(const SFilterConfig &_cfg, + int _iFFTRealDetectorCount, + int _iFFTFourierDetectorCount); + +// Convert string to filter type. Returns FILTER_ERROR if unrecognized. +E_FBPFILTER convertStringToFilter(const char * _filterType); + +SFilterConfig getFilterConfigForAlgorithm(const Config& _cfg, CAlgorithm *_alg); + +bool checkCustomFilterSize(const SFilterConfig &_cfg, const CProjectionGeometry2D &_geom); + + +int calcNextPowerOfTwo(int _iValue); +int calcFFTFourierSize(int _iFFTRealSize); + + } -#endif /* FBP_FILTERS_H */ +#endif diff --git a/include/astra/cuda/2d/astra.h b/include/astra/cuda/2d/astra.h index 6f0e2f0..a2f2219 100644 --- a/include/astra/cuda/2d/astra.h +++ b/include/astra/cuda/2d/astra.h @@ -28,7 +28,6 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>. #ifndef _CUDA_ASTRA_H #define _CUDA_ASTRA_H -#include "fbp_filters.h" #include "dims.h" #include "algo.h" diff --git a/include/astra/cuda/2d/fbp.h b/include/astra/cuda/2d/fbp.h index 8666646..1adf3b1 100644 --- a/include/astra/cuda/2d/fbp.h +++ b/include/astra/cuda/2d/fbp.h @@ -26,7 +26,7 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>. */ #include "algo.h" -#include "fbp_filters.h" +#include "astra/Filters.h" namespace astraCUDA { @@ -75,9 +75,7 @@ public: // FILTER_COSINE, FILTER_HAMMING, and FILTER_HANN) // have a D variable, which gives the cutoff point in the frequency domain. // Setting this value to 1.0 will include the whole filter - bool setFilter(astra::E_FBPFILTER _eFilter, - const float * _pfHostFilter = NULL, - int _iFilterWidth = 0, float _fD = 1.0f, float _fFilterParameter = -1.0f); + bool setFilter(const astra::SFilterConfig &_cfg); bool setShortScan(bool ss) { m_bShortScan = ss; return true; } diff --git a/include/astra/cuda/2d/fft.h b/include/astra/cuda/2d/fft.h index d36cae2..f77cbde 100644 --- a/include/astra/cuda/2d/fft.h +++ b/include/astra/cuda/2d/fft.h @@ -31,7 +31,7 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>. #include <cufft.h> #include <cuda.h> -#include "fbp_filters.h" +#include "astra/Filters.h" namespace astraCUDA { @@ -58,11 +58,9 @@ bool runCudaIFFT(int _iProjectionCount, const cufftComplex* _pDevSourceComplex, void applyFilter(int _iProjectionCount, int _iFreqBinCount, cufftComplex * _pSinogram, cufftComplex * _pFilter); -int calcFFTFourierSize(int _iFFTRealSize); - -void genFilter(astra::E_FBPFILTER _eFilter, float _fD, int _iProjectionCount, - cufftComplex * _pFilter, int _iFFTRealDetectorCount, - int _iFFTFourierDetectorCount, float _fParameter = -1.0f); +void genCuFFTFilter(const astra::SFilterConfig &_cfg, int _iProjectionCount, + cufftComplex * _pFilter, int _iFFTRealDetectorCount, + int _iFFTFourierDetectorCount); void genIdenFilter(int _iProjectionCount, cufftComplex * _pFilter, int _iFFTRealDetectorCount, int _iFFTFourierDetectorCount); |