package edu.stanford.rsl.tutorial.test; import ij.ImagePlus; import edu.stanford.rsl.apps.gui.XCatMetricPhantomCreator; import edu.stanford.rsl.conrad.data.numeric.Grid2D; import edu.stanford.rsl.conrad.data.numeric.Grid3D; import edu.stanford.rsl.conrad.data.numeric.NumericPointwiseOperators; import edu.stanford.rsl.conrad.geometry.shapes.simple.PointND; import edu.stanford.rsl.conrad.geometry.trajectories.Trajectory; import edu.stanford.rsl.conrad.opencl.OpenCLBackProjector; import edu.stanford.rsl.conrad.opencl.OpenCLProjectionPhantomRenderer; import edu.stanford.rsl.conrad.phantom.AnalyticPhantom4D; import edu.stanford.rsl.conrad.phantom.renderer.MetricPhantomRenderer; import edu.stanford.rsl.conrad.phantom.renderer.PhantomRenderer; import edu.stanford.rsl.conrad.utils.CONRAD; import edu.stanford.rsl.conrad.utils.Configuration; import edu.stanford.rsl.conrad.utils.ImageUtil; import edu.stanford.rsl.tutorial.cone.ConeBeamCosineFilter; import edu.stanford.rsl.tutorial.filters.RamLakKernel; public class VolumeCenteringTest { public static void main(String[] args) { // TODO Auto-generated method stub int timesteps = 2; CONRAD.setup(); Configuration config = Configuration.getGlobalConfiguration(); Trajectory geom = config.getGeometry(); PointND saveWorldOrigin = new PointND(geom.getOriginX(),geom.getOriginY(),geom.getOriginZ()); XCatMetricPhantomCreator creator = new XCatMetricPhantomCreator(); creator.setSteps(timesteps); AnalyticPhantom4D scene = creator.instantiateScene(); ImagePlus hyper = creator.renderMetricVolumePhantom(scene); Grid3D hyperGrid = ImageUtil.wrapImagePlus(hyper); hyperGrid.show("Phantom Creator"); geom.setOriginInWorld(saveWorldOrigin); MetricPhantomRenderer renderFromDialogBox = new MetricPhantomRenderer(); try { renderFromDialogBox.configure(); Grid3D slices = PhantomRenderer.generateProjections(renderFromDialogBox); slices.show(renderFromDialogBox.toString()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } Trajectory geo = Configuration.getGlobalConfiguration().getGeometry(); double focalLength = geo.getSourceToDetectorDistance(); int maxU_PX = geo.getDetectorWidth(); int maxV_PX = geo.getDetectorHeight(); double deltaU = geo.getPixelDimensionX(); double deltaV = geo.getPixelDimensionY(); double maxU = (maxU_PX) * deltaU; double maxV = (maxV_PX) * deltaV; float D = (float) focalLength; OpenCLProjectionPhantomRenderer phantom = new OpenCLProjectionPhantomRenderer(); try { phantom.configure(); Grid3D projections = PhantomRenderer.generateProjections(phantom); projections.show(phantom.toString()); ConeBeamCosineFilter cbFilter = new ConeBeamCosineFilter(focalLength, maxU, maxV, deltaU, deltaV); RamLakKernel ramK = new RamLakKernel(maxU_PX, deltaU); for(int i = 0; i < projections.getSize()[2]; i++){ Grid2D proj = projections.getSubGrid(i); cbFilter.applyToGrid(proj); //ramp for (int j = 0;j <maxV_PX; ++j) ramK.applyToGrid(proj.getSubGrid(j)); NumericPointwiseOperators.multiplyBy(proj, (float) (D*D * Math.PI / geo.getNumProjectionMatrices())); } OpenCLBackProjector projector = new OpenCLBackProjector(); projector.loadInputQueue(projections); Grid3D recon = projector.reconstructCompleteQueue(); recon.show("Recontruction"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }