import javax.swing.SwingUtilities;
import edu.stanford.rsl.conrad.filtering.multiprojection.anisotropic.AnisotropicFilterFunction;
import edu.stanford.rsl.conrad.utils.CONRAD;
import edu.stanford.rsl.conrad.utils.Configuration;
import edu.stanford.rsl.conrad.utils.UserUtil;
import edu.stanford.rsl.conrad.volume3d.JTransformsFFTVolumeHandle;
import edu.stanford.rsl.conrad.volume3d.ParallelVolumeOperator;
import edu.stanford.rsl.conrad.volume3d.Volume3D;
import ij.IJ;
import ij.ImagePlus;
import ij.plugin.PlugIn;
/**
* Filters the projection data with a 2-D filter which is selected via the ImageJ GUI.
*
* @author Andreas Maier
*
*/
public class Anisotropic_Filtering implements PlugIn {
public Anisotropic_Filtering(){
}
@Override
public void run(String arg) {
// We don't want ImageJ to run this Thread.
SwingUtilities.invokeLater(new Runnable() {
public void run(){
try{
Configuration.loadConfiguration();
ImagePlus current = IJ.getImage();
boolean uneven = current.getStackSize() % 2 == 1;
int context = UserUtil.queryInt("Context Size: ", 16);
float smoothness = (float) UserUtil.queryDouble("Smoothness: ", 2.0);
float lowerTensorLevel = (float) UserUtil.queryDouble("Lower limit in Tensor: ", 0.0);
float upperTensorLevel = (float) UserUtil.queryDouble("Upper limit in Tensor: ", 1.0);
float highPassLowerLevel = (float) UserUtil.queryDouble("Lower limit in high pass sigmoid: ", 0.5);
float highPassUpperLevel = (float) UserUtil.queryDouble("Upper limit in high pass sigmoid: ", 1.5);
float lpUpper = (float) UserUtil.queryDouble("Strengh of low pass filter: ", 1.5f);
int A = (int) UserUtil.queryDouble("Exponent: ", 1);
float B = (float) UserUtil.queryDouble("B: ", 2f);
float ri = (float) UserUtil.queryDouble("ri: ", 1.5f);
float a = (float) UserUtil.queryDouble("a: ", 1.0f);
boolean showAbsoluteTensor = UserUtil.queryBoolean("Display Magnitude Image of Tensor?");
int margin = context;
if (margin%2==1) margin ++;
Volume3D vol = new Volume3D(current, margin, 3,uneven);
AnisotropicFilterFunction filter = new AnisotropicFilterFunction(new JTransformsFFTVolumeHandle(new ParallelVolumeOperator()), new ParallelVolumeOperator());
System.out.println("Start: " + System.currentTimeMillis());
Volume3D [] filtered = filter.computeAnisotropicFilteredVolume(vol, lowerTensorLevel, upperTensorLevel, highPassLowerLevel, highPassUpperLevel, smoothness, A, B, ri, a, lpUpper);
filtered[0].getImagePlus("Anisotropic Filtered " + current.getTitle(), margin, 3,uneven).show();
if (showAbsoluteTensor) {
filtered[1].getImagePlus("Tensor Norm " + current.getTitle(), margin, 3,uneven).show();
}
filter = null;
vol = null;
CONRAD.gc();
} catch (Exception e){
e.printStackTrace();
}
System.out.println("End: " + System.currentTimeMillis());
}
});
}
}
/*
* Copyright (C) 2010-2014 - Andreas Maier
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/