/* * Copyright (C) 2014 Madgalena Herbst * CONRAD is developed as an Open Source project under the GNU General Public License (GPL). */ package edu.stanford.rsl.tutorial.noncircularfov; import ij.IJ; import ij.ImageJ; import edu.stanford.rsl.conrad.data.numeric.Grid2D; import edu.stanford.rsl.conrad.data.numeric.NumericPointwiseOperators; import edu.stanford.rsl.conrad.utils.ImageUtil; /** * Example that shows the boundaries and corresponding lines in the sinogram * * @author Magdalena * */ public class Boundaries { public static void main(String[] args) { double gammaM = 2 * 11.768288932020647 * Math.PI / 180, maxT = 500, deltaT = 1.0, focalLength = (maxT / 2.0 - 0.5) * deltaT / Math.tan(gammaM), maxBeta = 360 * Math.PI / 180, // +gammaM*2, deltaBeta = maxBeta / 360; // Load a saved sinogram, then it is not necessary to perform the // projection every time again. Remember to set the scanning parameter // according to the sinogram String path = "C:/Users/Magdalena/Pictures/Sinogram_Ellipse_0.7_0.3.zip"; Grid2D sino = ImageUtil.wrapImagePlusSlice(IJ.openImage(path), 1, true); sino.setSpacing(deltaT, deltaBeta); new ImageJ(); int width = sino.getWidth(); int height = sino.getHeight(); Grid2D bounds = new Grid2D(width, height); Grid2D mask = new Grid2D(width, height); int detSize = 250; // detector size in pixel // find the boundaries of the sinogram = the first non-zero pixel // left boundary + left boundary shifted by detectorsize for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { if (sino.getAtIndex(x, y) > 0) { bounds.setAtIndex(x, y, 1.f); bounds.setAtIndex(x + detSize, y, 0.5f); mask.setAtIndex(x + detSize, y, 1.f); break; } } // right boundary for (int x = width - 1; x >= 0; x--) { if (sino.getAtIndex(x, y) > 0) { bounds.setAtIndex(x, y, 1.f); break; } } } Correspondences c = new Correspondences(focalLength, sino); Grid2D boundsInv = c.findRedundancies(mask, mask); Grid2D point = new Grid2D(width, height); // this was to check the intersection points and the corresponding // points, values have to be changed dependent on the sinogram and the // detector size point.setAtIndex(118, 333, 1.f); point.setAtIndex(428, 53, 1.f); Grid2D pointD = c.findCorrespondences(point, point); NumericPointwiseOperators.addBy(bounds, boundsInv); sino.show("Sinogram"); bounds.show("Boundauries and corresponding lines"); pointD.show("Intersection points and corresponding points"); } }