content: package edu.stanford.rsl.apps.gui.roi;
  
  
  import ij.IJ;
  import ij.gui.Line;
  import edu.stanford.rsl.conrad.utils.DoubleArrayUtil;
  import edu.stanford.rsl.conrad.utils.FFTUtil;
  import edu.stanford.rsl.conrad.utils.VisualizationUtil;
  
  
  public class MeasureInlayMTF extends EvaluateROI {
  	
  	@Override
  	public Object evaluate() {
  		if (configured) {
  			double centerX = roi.getBounds().getCenterX();
  			double centerY = roi.getBounds().getCenterY();
  			double radius = roi.getFeretsDiameter() / 2;
  			if (roi instanceof Line){
  				// Use line as description
  				Line line = (Line) roi;
  				centerX = line.x1d;
  				centerY = line.y1d;
  				radius = Math.sqrt(Math.pow(line.x1d - line.x2d, 2) + Math.pow(line.y1d-line.y2d, 2));
  			}
  			double [] sum = null;
  			for (int i =0; i < 360; i ++){ 
  				Line line = new Line(centerX, centerY, centerX + Math.cos(Math.PI /180.0 * i) * radius, centerY + Math.sin(Math.PI /180.0 * i) * radius);
  				line.setImage(image);
  				double [] pixels = line.getPixels();
  				double [] kernel = {-1, 0, 1};
  				double [] edge = DoubleArrayUtil.convolve(pixels, kernel);
  				double [] fft = FFTUtil.fft(edge);
  				if (sum == null) {
  					sum = fft;
  				} else {
  					DoubleArrayUtil.add(sum, fft);
  				}
  				if (debug) System.out.println(i + " " + line.x2d + " " + line.y2d);
  			}
  			DoubleArrayUtil.divide(sum, 360);
  			VisualizationUtil.createHalfComplexPowerPlot(sum, "Inlay MTF of " + image.getTitle()).show();
  		}
  		return null;
  	}
  
  	public void configure() throws Exception {
  		image = IJ.getImage();
  		roi = image.getRoi();
  		if (roi != null){
  			configured = true;
  		}
  	}
  
  	@Override
  	public String toString() {
  		return "Measure MTF at an phantom inlay";
  	}
  
  
  }
  /*
   * Copyright (C) 2010-2014 - Andreas Maier 
   * CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
  */