package edu.stanford.rsl.apps.gui.roi; import ij.IJ; import ij.gui.Line; import ij.gui.Plot; import edu.stanford.rsl.conrad.numerics.SimpleVector; import edu.stanford.rsl.conrad.utils.DoubleArrayUtil; import edu.stanford.rsl.conrad.utils.FFTUtil; import edu.stanford.rsl.conrad.utils.VisualizationUtil; import edu.stanford.rsl.jpop.utils.UserUtil; public class MeasureEdgeMTF extends EvaluateROI { double offset = 1; @Override public Object evaluate() { if (configured) { if (roi instanceof Line){ Line line = (Line) roi; SimpleVector normal = new SimpleVector(line.y2-line.y1,line.x2-line.x1); normal.normalizeL2(); normal.multiplyBy(offset); SimpleVector step = normal.clone(); step.multiplyBy(1/50.0); double [] fftAll = null; for (int i = 0; i < 100; i++){ Line newLine = new Line(line.x1-normal.getElement(0)+i*step.getElement(0), line.y1-normal.getElement(1)+i*step.getElement(1), line.x2-normal.getElement(0)+i*step.getElement(0), line.y2-normal.getElement(1)+i*step.getElement(1)); newLine.setImage(image); double [] pixels = newLine.getPixels(); //VisualizationUtil.createPlot("Line", pixels).show(); double [] kernel = {-1, 0, 1}; double [] edge = DoubleArrayUtil.convolve(pixels, kernel); //VisualizationUtil.createPlot("Edge", edge).show(); double [] fft = FFTUtil.fft(edge); if (fftAll==null){ fftAll = fft; } else { DoubleArrayUtil.add(fftAll, fft); } } DoubleArrayUtil.divide(fftAll, 100); Plot plot = VisualizationUtil.createHalfComplexPowerPlot(fftAll, "Edge MTF of " + image.getTitle()); try { plot.show(); } catch (Exception e){ System.out.println(plot.toString()); } } } return null; } public void configure() throws Exception { image = IJ.getImage(); roi = image.getRoi(); offset = UserUtil.queryDouble("Enter Offset +/- for Averaging in [mm]", offset); if (roi != null){ configured = true; } } @Override public String toString() { return "Measure MTF of an edge"; } } /* * Copyright (C) 2010-2014 - Andreas Maier * CONRAD is developed as an Open Source project under the GNU General Public License (GPL). */