From c95b9c0217484e8e692e808fdc6cbccbd2e000eb Mon Sep 17 00:00:00 2001 From: Stephan Saalfeld Date: Fri, 8 Jan 2016 20:29:22 -0500 Subject: [PATCH] actually use multiplehypotheses flag and other fixes --- .../lenscorrection/DistortionCorrectionTask.java | 59 ++++++++++++---------- .../java/lenscorrection/Distortion_Correction.java | 32 ++++++------ .../src/main/java/mpicbg/trakem2/align/Align.java | 10 ++-- 3 files changed, 53 insertions(+), 48 deletions(-) diff --git a/TrakEM2_/src/main/java/lenscorrection/DistortionCorrectionTask.java b/TrakEM2_/src/main/java/lenscorrection/DistortionCorrectionTask.java index 7aeed3f3..16ca5b3d 100644 --- a/TrakEM2_/src/main/java/lenscorrection/DistortionCorrectionTask.java +++ b/TrakEM2_/src/main/java/lenscorrection/DistortionCorrectionTask.java @@ -51,18 +51,18 @@ final public class DistortionCorrectionTask /** * Minimal absolute number of inliers */ - public int minNumInliers = 12; + public int minNumInliers = 20; - public boolean multipleHypotheses = false; + public boolean multipleHypotheses = true; /** * Ignore identity transform up to a given tolerance */ - public boolean rejectIdentity = false; + public boolean rejectIdentity = true; public float identityTolerance = 5.0f; public int desiredModelIndex = 1; - public int maxIterationsOptimize = 1000; + public int maxIterationsOptimize = 2000; public int maxPlateauwidthOptimize = 200; public int maxNumThreadsSift = Runtime.getRuntime().availableProcessors(); @@ -71,8 +71,16 @@ final public class DistortionCorrectionTask * Regularization for approximate alignment */ public boolean regularize = false; - public int regularizerIndex = 1; - public double lambdaRegularize = 0.1; + public int regularizerIndex = 0; + public double lambdaRegularize = 0.01; + + public CorrectDistortionFromSelectionParam() + { + sift.fdSize = 4; + expectedModelIndex = 0; + desiredModelIndex = 0; + minInlierRatio = 0; + } public boolean setupSIFT( final String title ) { @@ -117,6 +125,7 @@ final public class DistortionCorrectionTask gd.addCheckbox( "test_multiple_hypotheses", multipleHypotheses ); gd.addCheckbox( "ignore constant background", rejectIdentity ); gd.addNumericField( "tolerance :", identityTolerance, 2, 6, "px" ); + gd.addCheckbox( "tiles are rougly in place", tilesAreInPlace ); gd.showDialog(); @@ -130,6 +139,7 @@ final public class DistortionCorrectionTask multipleHypotheses = gd.getNextBoolean(); rejectIdentity = gd.getNextBoolean(); identityTolerance = ( float )gd.getNextNumber(); + tilesAreInPlace = gd.getNextBoolean(); final GenericDialog gdOptimize = new GenericDialog( "Distortion Correction: Montage Optimization" ); gdOptimize.addChoice( "desired_transformation :", modelStrings, modelStrings[ desiredModelIndex ] ); @@ -137,8 +147,6 @@ final public class DistortionCorrectionTask gdOptimize.addMessage( "Optimization:" ); gdOptimize.addNumericField( "maximal_iterations :", maxIterationsOptimize, 0 ); gdOptimize.addNumericField( "maximal_plateauwidth :", maxPlateauwidthOptimize, 0 ); - //gdOptimize.addCheckbox( "filter outliers", filterOutliers ); - //gdOptimize.addNumericField( "mean_factor :", meanFactor, 2 ); gdOptimize.showDialog(); @@ -167,32 +175,27 @@ final public class DistortionCorrectionTask } final GenericDialog gdLens = new GenericDialog( "Distortion Correction: Lens Distortion" ); - addFields( gdLens ); - - gdLens.showDialog(); - if ( gdLens.wasCanceled() ) - return false; - - readFields( gdLens ); - final GenericDialog gdMisc = new GenericDialog( "Distortion Correction: Miscellaneous" ); - gdMisc.addCheckbox( "tiles are rougly in place", tilesAreInPlace ); + gdLens.addMessage( "Lens Model :" ); + gdLens.addNumericField( "power_of_polynomial_kernel :", dimension, 0 ); + gdLens.addNumericField( "lambda :", lambda, 6 ); - gdMisc.addMessage( "Apply Distortion Correction :" ); + gdLens.addMessage( "Apply Distortion Correction :" ); - Utils.addLayerRangeChoices( selection.getLayer(), gdMisc ); - gdMisc.addCheckbox( "clear_present_transforms", clearTransform ); - gdMisc.addCheckbox( "visualize_distortion_model", visualize ); + Utils.addLayerRangeChoices( selection.getLayer(), gdLens ); + gdLens.addCheckbox( "clear_present_transforms", clearTransform ); + gdLens.addCheckbox( "visualize_distortion_model", visualize ); - gdMisc.showDialog(); - if ( gdMisc.wasCanceled() ) + gdLens.showDialog(); + if ( gdLens.wasCanceled() ) return false; - tilesAreInPlace = gdMisc.getNextBoolean(); - firstLayerIndex = gdMisc.getNextChoiceIndex(); - lastLayerIndex = gdMisc.getNextChoiceIndex(); - clearTransform = gdMisc.getNextBoolean(); - visualize = gdMisc.getNextBoolean(); + dimension = ( int )gdLens.getNextNumber(); + lambda = ( double )gdLens.getNextNumber(); + firstLayerIndex = gdLens.getNextChoiceIndex(); + lastLayerIndex = gdLens.getNextChoiceIndex(); + clearTransform = gdLens.getNextBoolean(); + visualize = gdLens.getNextBoolean(); return true; } diff --git a/TrakEM2_/src/main/java/lenscorrection/Distortion_Correction.java b/TrakEM2_/src/main/java/lenscorrection/Distortion_Correction.java index d12a5658..9e5cc650 100644 --- a/TrakEM2_/src/main/java/lenscorrection/Distortion_Correction.java +++ b/TrakEM2_/src/main/java/lenscorrection/Distortion_Correction.java @@ -39,16 +39,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package lenscorrection; -import ij.IJ; -import ij.ImagePlus; -import ij.gui.GenericDialog; -import ij.io.DirectoryChooser; -import ij.io.FileSaver; -import ij.io.Opener; -import ij.plugin.PlugIn; -import ij.process.ColorProcessor; -import ij.process.ImageProcessor; - import java.awt.Color; import java.awt.geom.AffineTransform; import java.io.BufferedWriter; @@ -62,6 +52,21 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; +import org.jfree.chart.ChartFactory; +import org.jfree.chart.JFreeChart; +import org.jfree.chart.plot.PlotOrientation; +import org.jfree.data.category.DefaultCategoryDataset; + +import Jama.Matrix; +import ij.IJ; +import ij.ImagePlus; +import ij.gui.GenericDialog; +import ij.io.DirectoryChooser; +import ij.io.FileSaver; +import ij.io.Opener; +import ij.plugin.PlugIn; +import ij.process.ColorProcessor; +import ij.process.ImageProcessor; import mpi.fruitfly.general.MultiThreading; import mpicbg.ij.SIFT; import mpicbg.imagefeatures.Feature; @@ -75,13 +80,6 @@ import mpicbg.models.RigidModel2D; import mpicbg.models.SimilarityModel2D; import mpicbg.models.TranslationModel2D; -import org.jfree.chart.ChartFactory; -import org.jfree.chart.JFreeChart; -import org.jfree.chart.plot.PlotOrientation; -import org.jfree.data.category.DefaultCategoryDataset; - -import Jama.Matrix; - public class Distortion_Correction implements PlugIn{ diff --git a/TrakEM2_/src/main/java/mpicbg/trakem2/align/Align.java b/TrakEM2_/src/main/java/mpicbg/trakem2/align/Align.java index 9cfb4bd7..013fdf5f 100644 --- a/TrakEM2_/src/main/java/mpicbg/trakem2/align/Align.java +++ b/TrakEM2_/src/main/java/mpicbg/trakem2/align/Align.java @@ -626,7 +626,8 @@ public class Align p.minInlierRatio, p.minNumInliers, p.rejectIdentity, - p.identityTolerance ); + p.identityTolerance, + multipleHypotheses ); if ( modelFound ) Utils.log( "Model found for tiles \"" + tilePair[ 0 ].getPatch() + "\" and \"" + tilePair[ 1 ].getPatch() + "\":\n correspondences " + inliers.size() + " of " + candidates.size() + "\n average residual error " + model.getCost() + " px\n took " + ( System.currentTimeMillis() - s ) + " ms" ); @@ -673,16 +674,17 @@ public class Align { boolean again = false; int nHypotheses = 0; + final ArrayList< PointMatch > hypothesisCandidates = new ArrayList< PointMatch >( candidates ); try { do { again = false; final ArrayList< PointMatch > inliers2 = new ArrayList< PointMatch >(); - final boolean modelFound = model.filterRansac( candidates, inliers2, 1000, maxEpsilon, minInlierRatio, minNumInliers, 3 ); + final boolean modelFound = model.filterRansac( hypothesisCandidates, inliers2, 1000, maxEpsilon, minInlierRatio, minNumInliers, 3 ); if ( modelFound ) { - candidates.removeAll( inliers2 ); + hypothesisCandidates.removeAll( inliers2 ); if ( rejectIdentity ) { @@ -718,6 +720,8 @@ public class Align { model.fit( inliers ); PointMatch.apply( inliers, model ); + model.setCost( PointMatch.meanDistance( inliers ) ); + Utils.log( nHypotheses + " hypotheses" ); } catch ( final NotEnoughDataPointsException e ) {} catch ( final IllDefinedDataPointsException e ) -- 2.11.4.GIT