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.Projection.CameraAxisDirection; import edu.stanford.rsl.conrad.geometry.trajectories.CircularTrajectory; import edu.stanford.rsl.conrad.numerics.SimpleMatrix; import edu.stanford.rsl.conrad.numerics.SimpleVector; import edu.stanford.rsl.conrad.phantom.NumericalSheppLogan3D; import edu.stanford.rsl.conrad.reconstruction.iterative.DistanceDrivenBasedReconstruction; import edu.stanford.rsl.conrad.utils.VisualizationUtil; public class IterativeReconstructionTestA { public static boolean Debug1 = false; public static boolean Debug2 = false; public static boolean Debug3 = true; 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(256, 256, 128); 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(2.0); 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(CameraAxisDirection.DETECTORMOTION_PLUS); dataTrajectory.setDetectorVDirection(CameraAxisDirection.ROTATIONAXIS_PLUS); dataTrajectory.setTrajectory( 200, 300.0, 1.0 , -0.5, -0.5, CameraAxisDirection.DETECTORMOTION_PLUS, CameraAxisDirection.ROTATIONAXIS_PLUS, rotationAxis); } public static void printSimpleMatrix( SimpleMatrix A ){ int n = A.getRows(); int m = A.getCols(); for (int i = 0; i < n ; i++ ){ for (int j = 0; j < m ; j++){ System.out.print( A.getElement(i, j) + "\t"); } System.out.print("\n"); } } public static void main(String[] args){ System.out.println("Hello World!"); CircularTrajectory dataTrajectory = new CircularTrajectory(); initTrajectory( dataTrajectory ); Projection Pmatrix; SimpleVector cameraCenter; SimpleMatrix ProjMatrix; DistanceDrivenBasedReconstruction ddTester = new DistanceDrivenBasedReconstruction( dataTrajectory ); if ( Debug1 ){ System.out.println("Hello World Debug1!"); System.out.println("Detector size: " + dataTrajectory.getDetectorWidth() + " X " + dataTrajectory.getDetectorHeight() ); System.out.println("Volume size: " + dataTrajectory.getReconDimensionX() + " X " + dataTrajectory.getReconDimensionY() + " X " + dataTrajectory.getReconDimensionZ()); System.out.println("Detector direction: " + dataTrajectory.getDetectorUDirection() + ", " + dataTrajectory.getDetectorVDirection() ); for (int p = 0; p < dataTrajectory.getNumProjectionMatrices() ; p ++ ){ Pmatrix = dataTrajectory.getProjectionMatrix(p); cameraCenter = Pmatrix.computeCameraCenter(); System.out.println( "Camera center at: " + cameraCenter.getElement(0) + ", " + cameraCenter.getElement(1) ); } } if (Debug2){ System.out.println("Hello World Debug2!"); for (int p = 0; p < dataTrajectory.getNumProjectionMatrices() ; p ++ ){ Pmatrix = dataTrajectory.getProjectionMatrix(p); ProjMatrix = Pmatrix.computeP(); System.out.println( "Projection matrix @" + p + ":" ); printSimpleMatrix( ProjMatrix ); } } if (Debug3){ try { ddTester.initializeTest(); } catch (Exception e1) { e1.printStackTrace(); } try { NumericalSheppLogan3D phan = new NumericalSheppLogan3D(dataTrajectory.getReconDimensionX(), dataTrajectory.getReconDimensionY(), dataTrajectory.getReconDimensionZ()); Grid3D image = phan.getNumericalSheppLoganPhantom(); VisualizationUtil.showGrid3DZ( image, "original phantom" ).show(); Grid3D proj = ddTester.InitializeProjectionViews(); Grid3D vol = ddTester.InitializeVolumeImage(); ddTester.forwardproject(proj, image); VisualizationUtil.showGrid3DX( proj, "projection images" ).show(); ddTester.backproject(proj, vol); VisualizationUtil.showGrid3DZ( vol, "backprojected image" ).show(); ddTester.printOutGeometry(); } 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). */