package edu.stanford.rsl.conrad.reconstruction.test; import edu.stanford.rsl.conrad.data.numeric.Grid3D; import edu.stanford.rsl.conrad.geometry.Projection; import edu.stanford.rsl.conrad.geometry.trajectories.CircularTrajectory; import edu.stanford.rsl.conrad.numerics.SimpleVector; import edu.stanford.rsl.conrad.phantom.NumericalSheppLogan3D; import edu.stanford.rsl.conrad.reconstruction.iterative.PenalizedLeastSquareART; import edu.stanford.rsl.conrad.utils.VisualizationUtil; public class IterativeReconstructionTestB { public static void initTrajectory( CircularTrajectory dataTrajectory ){ SimpleVector rotationAxis = new SimpleVector(0, 0, 1); dataTrajectory.setDetectorHeight(128); dataTrajectory.setDetectorWidth(256); dataTrajectory.setSourceToAxisDistance(400.0); dataTrajectory.setSourceToDetectorDistance(800.0); dataTrajectory.setReconDimensions(128, 128, 64); dataTrajectory.setOriginInPixelsX((dataTrajectory.getReconDimensionX()-1)/2 ); dataTrajectory.setOriginInPixelsY((dataTrajectory.getReconDimensionY()-1)/2 ); dataTrajectory.setOriginInPixelsZ((dataTrajectory.getReconDimensionZ()-1)/2 ); dataTrajectory.setDetectorOffsetU(0); dataTrajectory.setDetectorOffsetV(0); dataTrajectory.setPixelDimensionX(1.5); dataTrajectory.setPixelDimensionY(4.0); dataTrajectory.setVoxelSpacingX(1.0); dataTrajectory.setVoxelSpacingY(1.0); dataTrajectory.setVoxelSpacingZ(2.0); dataTrajectory.setAverageAngularIncrement(1.0); dataTrajectory.setProjectionStackSize(20); dataTrajectory.setDetectorUDirection(Projection.CameraAxisDirection.DETECTORMOTION_PLUS); dataTrajectory.setDetectorVDirection(Projection.CameraAxisDirection.ROTATIONAXIS_PLUS); dataTrajectory.setTrajectory( 200, 300.0, 1.0 , -0.5, -0.5, Projection.CameraAxisDirection.DETECTORMOTION_PLUS, Projection.CameraAxisDirection.ROTATIONAXIS_PLUS, rotationAxis); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub float beta = 0.1f; float delta = 0.01f; int maxIterantion = 30; CircularTrajectory dataTrajectory = new CircularTrajectory(); initTrajectory( dataTrajectory ); PenalizedLeastSquareART reconSolver = new PenalizedLeastSquareART( dataTrajectory, maxIterantion, beta, delta ); //LeastSquaresCG reconSolver = new LeastSquaresCG( dataTrajectory ); try { reconSolver.initializeTest(); } catch (Exception e1) { e1.printStackTrace(); } try { NumericalSheppLogan3D phan = new NumericalSheppLogan3D(dataTrajectory.getReconDimensionX(), dataTrajectory.getReconDimensionY(), dataTrajectory.getReconDimensionZ()); Grid3D image = phan.getNumericalSheppLoganPhantom(); VisualizationUtil.showGrid3DZ( image, "Shepp Logan Phantom" ).show(); Grid3D proj = reconSolver.InitializeProjectionViews(); reconSolver.forwardproject(proj, image); VisualizationUtil.showGrid3DX( proj, "Projection images" ).show(); reconSolver.initialize(proj); reconSolver.iterativeReconstruct(); VisualizationUtil.showGrid3DZ( reconSolver.getvolumeImage(), "Reconstructed image" ).show(); } catch (Exception e) { e.printStackTrace(); } } } /* * Copyright (C) 2010-2014 Meng Wu * CONRAD is developed as an Open Source project under the GNU General Public License (GPL). */