/*- * #%L * Fiji distribution of ImageJ for the life sciences. * %% * Copyright (C) 2007 - 2017 Fiji developers. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-2.0.html>. * #L% */ package spim.fiji.plugin; import ij.ImageJ; import ij.gui.GenericDialog; import ij.plugin.PlugIn; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import mpicbg.spim.data.sequence.ViewId; import mpicbg.spim.data.sequence.ViewSetup; import mpicbg.spim.io.IOFunctions; import spim.fiji.plugin.fusion.Fusion; import spim.fiji.plugin.queryXML.LoadParseQueryXML; import spim.fiji.plugin.util.GUIHelper; import spim.fiji.spimdata.SpimData2; import spim.fiji.spimdata.imgloaders.AbstractImgLoader; import spim.process.fusion.boundingbox.AutomaticBoundingBox; import spim.process.fusion.boundingbox.AutomaticReorientation; import spim.process.fusion.boundingbox.BigDataViewerBoundingBox; import spim.process.fusion.boundingbox.BoundingBoxGUI; import spim.process.fusion.boundingbox.PreDefinedBoundingBox; import spim.process.fusion.deconvolution.EfficientBayesianBased; import spim.process.fusion.export.AppendSpimData2; import spim.process.fusion.export.DisplayImage; import spim.process.fusion.export.ExportSpimData2HDF5; import spim.process.fusion.export.ExportSpimData2TIFF; import spim.process.fusion.export.ImgExport; import spim.process.fusion.export.Save3dTIFF; import spim.process.fusion.weightedavg.WeightedAverageFusion; import spim.process.fusion.weightedavg.WeightedAverageFusion.WeightedAvgFusionType; import bdv.img.hdf5.Hdf5ImageLoader; public class Image_Fusion implements PlugIn { public final static ArrayList< Fusion > staticFusionAlgorithms = new ArrayList< Fusion >(); public static int defaultFusionAlgorithm = 1; public final static ArrayList< BoundingBoxGUI > staticBoundingBoxAlgorithms = new ArrayList< BoundingBoxGUI >(); public static int defaultBoundingBoxAlgorithm = -1; public final static ArrayList< ImgExport > staticImgExportAlgorithms = new ArrayList< ImgExport >(); public static int defaultImgExportAlgorithm = 0; static { IOFunctions.printIJLog = true; staticFusionAlgorithms.add( new EfficientBayesianBased( null, null ) ); staticFusionAlgorithms.add( new WeightedAverageFusion( null, null, WeightedAvgFusionType.FUSEDATA ) ); staticFusionAlgorithms.add( new WeightedAverageFusion( null, null, WeightedAvgFusionType.INDEPENDENT ) ); staticBoundingBoxAlgorithms.add( new BoundingBoxGUI( null, null ) ); staticBoundingBoxAlgorithms.add( new BigDataViewerBoundingBox( null, null ) ); staticBoundingBoxAlgorithms.add( new AutomaticReorientation( null, null ) ); staticBoundingBoxAlgorithms.add( new AutomaticBoundingBox( null, null ) ); staticBoundingBoxAlgorithms.add( new PreDefinedBoundingBox( null, null ) ); staticImgExportAlgorithms.add( new DisplayImage() ); staticImgExportAlgorithms.add( new Save3dTIFF( null ) ); staticImgExportAlgorithms.add( new ExportSpimData2TIFF() ); staticImgExportAlgorithms.add( new ExportSpimData2HDF5() ); staticImgExportAlgorithms.add( new AppendSpimData2() ); } @Override public void run( final String arg ) { // ask for everything final LoadParseQueryXML result = new LoadParseQueryXML(); if ( !result.queryXML( "image fusion", true, true, true, true ) ) return; fuse( result.getData(), SpimData2.getAllViewIdsSorted( result.getData(), result.getViewSetupsToProcess(), result.getTimePointsToProcess() ), result.getClusterExtension(), result.getXMLFileName(), true ); } public boolean fuse( final SpimData2 data, final List< ViewId > viewIds ) { return fuse( data, viewIds, "", null, false ); } public boolean fuse( final SpimData2 data, final List< ViewId > viewIds, final String clusterExtension, final String xmlFileName, final boolean saveXML ) { // the GenericDialog needs a list[] of String final String[] fusionDescriptions = new String[ staticFusionAlgorithms.size() ]; final String[] boundingBoxDescriptions = new String[ staticBoundingBoxAlgorithms.size() ]; final String[] imgExportDescriptions = new String[ staticImgExportAlgorithms.size() ]; for ( int i = 0; i < staticFusionAlgorithms.size(); ++i ) fusionDescriptions[ i ] = staticFusionAlgorithms.get( i ).getDescription(); for ( int i = 0; i < staticBoundingBoxAlgorithms.size(); ++i ) boundingBoxDescriptions[ i ] = staticBoundingBoxAlgorithms.get( i ).getDescription(); for ( int i = 0; i < staticImgExportAlgorithms.size(); ++i ) imgExportDescriptions[ i ] = staticImgExportAlgorithms.get( i ).getDescription(); if ( defaultFusionAlgorithm >= fusionDescriptions.length ) defaultFusionAlgorithm = 0; if ( defaultBoundingBoxAlgorithm < 0 ) { if ( data.getBoundingBoxes().getBoundingBoxes().size() > 0 ) defaultBoundingBoxAlgorithm = 4; else defaultBoundingBoxAlgorithm = 1; } if ( defaultBoundingBoxAlgorithm >= boundingBoxDescriptions.length ) defaultBoundingBoxAlgorithm = 0; if ( defaultImgExportAlgorithm >= imgExportDescriptions.length ) defaultImgExportAlgorithm = 0; final GenericDialog gd = new GenericDialog( "Image Fusion" ); gd.addChoice( "Type_of_image_fusion", fusionDescriptions, fusionDescriptions[ defaultFusionAlgorithm ] ); gd.addChoice( "Bounding_Box", boundingBoxDescriptions, boundingBoxDescriptions[ defaultBoundingBoxAlgorithm ] ); gd.addChoice( "Fused_image", imgExportDescriptions, imgExportDescriptions[ defaultImgExportAlgorithm ] ); // assemble the last registration names of all viewsetups involved final HashMap< String, Integer > names = GUIHelper.assembleRegistrationNames( data, viewIds ); gd.addMessage( "" ); GUIHelper.displayRegistrationNames( gd, names ); gd.addMessage( "" ); GUIHelper.addWebsite( gd ); if ( names.keySet().size() > 5 ) GUIHelper.addScrollBars( gd ); gd.showDialog(); if ( gd.wasCanceled() ) return false; final int fusionAlgorithm = defaultFusionAlgorithm = gd.getNextChoiceIndex(); final int boundingBoxAlgorithm = defaultBoundingBoxAlgorithm = gd.getNextChoiceIndex(); final int imgExportAlgorithm = defaultImgExportAlgorithm = gd.getNextChoiceIndex(); final Fusion fusion = staticFusionAlgorithms.get( fusionAlgorithm ).newInstance( data, viewIds ); final BoundingBoxGUI boundingBox = staticBoundingBoxAlgorithms.get( boundingBoxAlgorithm ).newInstance( data, viewIds ); final ImgExport imgExport = staticImgExportAlgorithms.get( imgExportAlgorithm ).newInstance(); if ( data.getSequenceDescription().getImgLoader() instanceof Hdf5ImageLoader ) BoundingBoxGUI.defaultPixelType = 1; // set to 16 bit by default for hdf5 if ( !boundingBox.queryParameters( fusion, imgExport ) ) return false; if ( !fusion.queryParameters() ) return false; // set all the properties required for exporting as a new XML or as addition to an existing XML fusion.defineNewViewSetups( boundingBox ); imgExport.setXMLData( fusion.getTimepointsToProcess(), fusion.getNewViewSetups() ); if ( !imgExport.queryParameters( data, boundingBox.getPixelType() == 1 ) ) return false; // did anyone modify this SpimData object? boolean spimDataModified = false; fusion.fuseData( boundingBox, imgExport ); spimDataModified |= boundingBox.cleanUp(); // save the XML if metadata was updated if ( data.getSequenceDescription().getImgLoader() instanceof AbstractImgLoader ) { try { for ( final ViewSetup setup : data.getSequenceDescription().getViewSetupsOrdered() ) spimDataModified |= ( (AbstractImgLoader)data.getSequenceDescription().getImgLoader() ).updateXMLMetaData( setup, false ); } catch( Exception e ) { IOFunctions.println( "Failed to update metadata, this should not happen: " + e ); } } spimDataModified |= imgExport.finish(); if ( spimDataModified && saveXML ) SpimData2.saveXML( data, xmlFileName, clusterExtension ); IOFunctions.println( "(" + new Date( System.currentTimeMillis() ) + "): Fusion finished." ); return true; } public static void main( final String[] args ) { LoadParseQueryXML.defaultXMLfilename = "/Users/preibischs/Documents/Microscopy/SPIM/HisYFP-SPIM//dataset.xml"; new ImageJ(); new Image_Fusion().run( null ); } }