diff options
| author | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2016-03-23 18:21:42 +0100 | 
|---|---|---|
| committer | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2016-03-23 18:21:42 +0100 | 
| commit | f9cc36d3507f7cde4d20165836d65a584ced720f (patch) | |
| tree | bfc8ea13fb565c56eabdc5b6396a92b66eda61fd /src | |
| parent | 37e1c06154362e26acdb4b09c4a251ec2ad0a316 (diff) | |
| download | astra-f9cc36d3507f7cde4d20165836d65a584ced720f.tar.gz astra-f9cc36d3507f7cde4d20165836d65a584ced720f.tar.bz2 astra-f9cc36d3507f7cde4d20165836d65a584ced720f.tar.xz astra-f9cc36d3507f7cde4d20165836d65a584ced720f.zip  | |
Fix accumulating multiple raylengths in SART
Thanks to @mohamedadaly for noticing.
Diffstat (limited to 'src')
| -rw-r--r-- | src/SartAlgorithm.cpp | 24 | 
1 files changed, 19 insertions, 5 deletions
diff --git a/src/SartAlgorithm.cpp b/src/SartAlgorithm.cpp index 9346160..f80df61 100644 --- a/src/SartAlgorithm.cpp +++ b/src/SartAlgorithm.cpp @@ -272,9 +272,8 @@ void CSartAlgorithm::run(int _iNrIterations)  	m_bShouldAbort = false; -	int iIteration = 0; -  	// data projectors +	CDataProjectorInterface* pFirstForwardProjector;  	CDataProjectorInterface* pForwardProjector;  	CDataProjectorInterface* pBackProjector; @@ -292,7 +291,7 @@ void CSartAlgorithm::run(int _iNrIterations)  	// first time forward projection data projector,  	// also computes total pixel weight and total ray length -	pForwardProjector = dispatchDataProjector( +	pFirstForwardProjector = dispatchDataProjector(  			m_pProjector,   			SinogramMaskPolicy(m_pSinogramMask),														// sinogram mask  			ReconstructionMaskPolicy(m_pReconstructionMask),											// reconstruction mask @@ -303,16 +302,30 @@ void CSartAlgorithm::run(int _iNrIterations)  			m_bUseSinogramMask, m_bUseReconstructionMask, true											 // options on/off  		); +	// forward projection data projector +	pForwardProjector = dispatchDataProjector( +			m_pProjector, +			SinogramMaskPolicy(m_pSinogramMask),														// sinogram mask +			ReconstructionMaskPolicy(m_pReconstructionMask),											// reconstruction mask +			CombinePolicy<DiffFPPolicy, TotalPixelWeightPolicy>(					// 2 basic operations +				DiffFPPolicy(m_pReconstruction, m_pDiffSinogram, m_pSinogram),								// forward projection with difference calculation +				TotalPixelWeightPolicy(m_pTotalPixelWeight)),												// calculate the total pixel weights +			m_bUseSinogramMask, m_bUseReconstructionMask, true											 // options on/off +		); +  	// iteration loop -	for (; iIteration < _iNrIterations && !m_bShouldAbort; ++iIteration) { +	for (int iIteration = 0; iIteration < _iNrIterations && !m_bShouldAbort; ++iIteration) {  		int iProjection = m_piProjectionOrder[m_iIterationCount % m_iProjectionCount];  		// forward projection and difference calculation  		m_pTotalPixelWeight->setData(0.0f); -		pForwardProjector->projectSingleProjection(iProjection); +		if (iIteration < m_iProjectionCount) +			pFirstForwardProjector->projectSingleProjection(iProjection); +		else +			pForwardProjector->projectSingleProjection(iProjection);  		// backprojection  		pBackProjector->projectSingleProjection(iProjection);  		// update iteration count @@ -325,6 +338,7 @@ void CSartAlgorithm::run(int _iNrIterations)  	} +	ASTRA_DELETE(pFirstForwardProjector);  	ASTRA_DELETE(pForwardProjector);  	ASTRA_DELETE(pBackProjector);  | 
