content: package edu.stanford.rsl.apps.gui.roi;
  
  import ij.IJ;
  import ij.ImagePlus;
  import ij.gui.Roi;
  import ij.plugin.frame.RoiManager;
  import ij.process.ImageStatistics;
  
  import javax.swing.JOptionPane;
  
  import edu.stanford.rsl.conrad.utils.ImageUtil;
  
  /**
   * Measures the MTF after Droege et al. "A practical method to measure the MTF of CT scanners". Med Phys 9(5). 758-760. 1982"
   * In order to use the plugin, use the roi manager to define the following ROIs:
   * CT_1 the one material of the MTF measurement
   * CT_2 the other material of the MTF measurement
   * M_1 
   * ... the line pair modules of the phantom
   * M_N
   * @author akmaier
   *
   */
  public class MeasureMTFDroege extends EvaluateROI {
  
  	public void configure() throws Exception {
  		ImagePlus [] images = ImageUtil.getAvailableImagePlusAsArray();
  		image = (ImagePlus) JOptionPane.showInputDialog(null, "Select image to measure MTF: ", "Image Selection", JOptionPane.PLAIN_MESSAGE, null, images, images[0]);
  		if (RoiManager.getInstance()!=null){
  			RoiManager manager = RoiManager.getInstance();
  			if (manager.getCount() <= 2){
  				IJ.showMessage("Please define at least 3 ROIs");
  			} else {
  				configured = true;
  			}
  		} else {
  			IJ.showMessage("Please use the ROI Manager to define at least 3 ROIs");
  		}
  	}
  
  	@Override
  	public Object evaluate() {
  		RoiManager manager = RoiManager.getInstance();
  		Roi [] rois = manager.getRoisAsArray();
  		Roi ct1roi = rois[0];
  		image.setRoi(ct1roi);
  		ImageStatistics stats = image.getStatistics();
  		double ct1 = stats.mean;
  		double n1 = stats.stdDev;
  		Roi ct2roi = rois[1];
  		image.setRoi(ct2roi);
  		stats = image.getStatistics();
  		double ct2 = stats.mean;
  		double n2 = stats.stdDev;
  		double n0 = Math.sqrt((n1*n1+n2*n2) / 2.0);
  		double m0 = Math.abs(ct2-ct1)/2.0;
  		for (int i = 2; i < rois.length; i++){
  			image.setRoi(rois[i]);
  			stats = image.getStatistics();
  			double m=Math.sqrt((stats.stdDev*stats.stdDev - n0*n0));
  			if (Double.isNaN(m)) m = 0;
  			double mtf = Math.PI * Math.sqrt(2) * 0.25 * m / m0;
  			System.out.println("Roi " + (i-1) + "\t" + mtf);
  		}
  		return null;
  	}
  
  	@Override
  	public String toString() {
  		return "Measure Droege MTF";
  	}
  
  }
  
  /*
   * Copyright (C) 2010-2014 - Andreas Maier 
   * CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
  */
  