package edu.stanford.rsl.tutorial.cone;
import ij.ImageJ;
import edu.stanford.rsl.conrad.data.numeric.Grid3D;
import edu.stanford.rsl.conrad.data.numeric.NumericPointwiseOperators;
import edu.stanford.rsl.conrad.geometry.trajectories.Trajectory;
import edu.stanford.rsl.conrad.phantom.NumericalSheppLogan3D;
import edu.stanford.rsl.conrad.utils.Configuration;
import edu.stanford.rsl.tutorial.cone.ConeBeamBackprojector;
import edu.stanford.rsl.tutorial.cone.ConeBeamCosineFilter;
import edu.stanford.rsl.tutorial.filters.RamLakKernel;
/**
* Simple example that computes and displays a cone-beam reconstruction.
*
* @author Recopra Seminar Summer 2012
*
*/
public class ConeBeamReconstructionExample {
/**
* @param args
*/
public static void main(String[] args) {
new ImageJ();
Configuration.loadConfiguration();
Configuration conf = Configuration.getGlobalConfiguration();
Trajectory geo = conf.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;
int imgSizeX = geo.getReconDimensionX();
int imgSizeY = geo.getReconDimensionY();
int imgSizeZ = geo.getReconDimensionZ();
//Phantom3D test3D = new Sphere3D(imgSizeX, imgSizeY, imgSizeZ);
Grid3D test3D = new NumericalSheppLogan3D(imgSizeX,
imgSizeY, imgSizeZ).getNumericalSheppLoganPhantom();
// Alternate Phantom
/*
* NumericalSheppLogan3D shepp3d = new NumericalSheppLogan3D(imgSizeX,
imgSizeY, imgSizeZ);
*/
Grid3D grid = test3D;
grid.show("object");
Grid3D sino;
ConeBeamProjector cbp = new ConeBeamProjector();
try {
sino = cbp.projectRayDrivenCL(grid);
} catch (Exception e) {
System.out.println(e);
return;
}
ConeBeamCosineFilter cbFilter = new ConeBeamCosineFilter(focalLength, maxU, maxV, deltaU, deltaV);
RamLakKernel ramK = new RamLakKernel(maxU_PX, deltaU);
for (int i = 0; i < geo.getProjectionStackSize(); ++i) {
cbFilter.applyToGrid(sino.getSubGrid(i));
//ramp
for (int j = 0;j <maxV_PX; ++j)
ramK.applyToGrid(sino.getSubGrid(i).getSubGrid(j));
}
sino.show("sinoFilt");
ConeBeamBackprojector cbbp = new ConeBeamBackprojector();
Grid3D recImage = cbbp.backprojectPixelDrivenCL(sino);
recImage.show("recImage");
if (true)
return;
}
}
/*
* Copyright (C) 2010-2014 Andreas Maier
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/