package edu.stanford.rsl.tutorial.motion.estimation; import ij.ImageJ; import edu.stanford.rsl.conrad.data.numeric.Grid2D; import edu.stanford.rsl.conrad.data.numeric.Grid3D; import edu.stanford.rsl.tutorial.phantoms.SimpleCubes3D; /** * This class applies a cylinder mask to the reconstructed volume Grid in order * to get rid of errors outside the VOI * * @author Marco Boegel * */ public class CylinderVolumeMask { private Grid2D mask; private int sizeY; private int sizeX; public CylinderVolumeMask(int sizeX, int sizeY, int xcenter, int ycenter, double radius) { this.sizeX = sizeX; this.sizeY = sizeY; mask = new Grid2D(sizeX, sizeY); initialize(radius, sizeX, sizeY, xcenter, ycenter); } private void initialize(double radius, int sizeX, int sizeY, int xcenter, int ycenter) { for (int i = 0; i < sizeX; i++) { for (int j = 0; j < sizeY; j++) { if (Math.pow(i - xcenter, 2) + Math.pow(j - ycenter, 2) <= (radius * radius)) { mask.setAtIndex(i, j, 1.f); } } } } public void applyToGrid(Grid3D input) { int size = input.getSize()[2]; for (int i = 0; i < size; i++) applyToGrid(input.getSubGrid(i)); } /** * Applies cylinder in a limited z-Range * * @param input * input grid * @param start * start z-coord in volume coordinates * @param end * end z-coord in volume coordinates * @param keepRest * if true leaves the rest of the volume as is, otherwise sets to * zero */ public void applyToGrid(Grid3D input, int start, int end, boolean keepRest) { int size = input.getSize()[2]; for (int i = start; i < end; i++) applyToGrid(input.getSubGrid(i)); if (keepRest == false) { for (int i = 0; i < start; i++) { for (int x = 0; x < sizeX; x++) { for (int y = 0; y < sizeY; y++) { input.getSubGrid(i).setAtIndex(x, y, 0); } } } for (int i = end; i < size; i++) { for (int x = 0; x < sizeX; x++) { for (int y = 0; y < sizeY; y++) { input.getSubGrid(i).setAtIndex(x, y, 0); } } } } } public void applyToGrid(Grid2D input) { for (int i = 0; i < sizeX; i++) { for (int j = 0; j < sizeY; j++) { input.multiplyAtIndex(i, j, mask.getAtIndex(i, j)); } } } public static void main(String args[]) { CylinderVolumeMask m = new CylinderVolumeMask(200, 200, 100, 100, 100); Grid3D s = new SimpleCubes3D(200, 200, 300); new ImageJ(); m.applyToGrid(s); s.show(); } } /* * Copyright (C) 2010-2014 Marco B�gel * CONRAD is developed as an Open Source project under the GNU General Public License (GPL). */