/*- * #%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.ImagePlus; import ij.ImageStack; import ij.plugin.PlugIn; import ij.process.FloatProcessor; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; import mpicbg.spim.data.SpimData; import mpicbg.spim.data.sequence.ImgLoader; import mpicbg.spim.data.sequence.TimePoint; import mpicbg.spim.data.sequence.ViewDescription; import mpicbg.spim.data.sequence.ViewId; import mpicbg.spim.data.sequence.ViewSetup; import mpicbg.spim.io.IOFunctions; import net.imglib2.Cursor; import net.imglib2.RandomAccessibleInterval; import net.imglib2.img.Img; import net.imglib2.img.array.ArrayImgFactory; import net.imglib2.type.NativeType; import net.imglib2.type.numeric.RealType; import net.imglib2.type.numeric.integer.UnsignedShortType; import spim.fiji.plugin.queryXML.LoadParseQueryXML; import spim.fiji.spimdata.SpimData2; import spim.process.fusion.deconvolution.ExtractPSF; import spim.process.fusion.weightedavg.ProcessFusion; public class Max_Project implements PlugIn { @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; maxProject( result.getData(), SpimData2.getAllViewIdsSorted( result.getData(), result.getViewSetupsToProcess(), result.getTimePointsToProcess() ), new UnsignedShortType() ); } public static < T extends RealType< T > & NativeType< T > > boolean maxProject( final SpimData data, final List< ? extends ViewId > viewIds, final T type ) { final ArrayList< ViewDescription > list = new ArrayList< ViewDescription >(); for ( final ViewId viewId : viewIds ) { final ViewDescription vd = data.getSequenceDescription().getViewDescription( viewId ); if ( vd != null && vd.isPresent() ) list.add( vd ); } return maxProject( list, data.getSequenceDescription().getImgLoader(), type ); } public static < T extends RealType< T > & NativeType< T > > boolean maxProject( final List< ? extends ViewDescription > vds, final ImgLoader imgLoader, final T type ) { Collections.sort( vds ); final ArrayList< TimePoint > tps = SpimData2.getAllTimePointsSorted( vds ); final ArrayList< ViewSetup > setups = SpimData2.getAllViewSetups( vds ); for ( final ViewSetup setup : setups ) { ImageStack stack = null; for ( final TimePoint t : tps ) for ( final ViewDescription vd : vds ) if ( vd.getTimePointId() == t.getId() && vd.getViewSetupId() == setup.getId() ) { IOFunctions.println( "(" + new Date( System.currentTimeMillis() ) + "): Loading image for timepoint " + t.getId() + " viewsetup " + vd.getViewSetupId() ); final RandomAccessibleInterval< T > img = ProcessFusion.getImage( type, imgLoader, vd, false ); final FloatProcessor fp = toProcessor( ExtractPSF.computeMaxProjection( img, new ArrayImgFactory< T >(), 2 ) ); if ( stack == null ) stack = new ImageStack( fp.getWidth(), fp.getHeight() ); stack.addSlice( "Timepoint=" + t.getId(), fp); } final ImagePlus imp = new ImagePlus( "ViewSetupId=" + setup.getId(), stack ); imp.setDimensions( 1, 1, stack.getSize() ); imp.show(); } return true; } public static FloatProcessor toProcessor( final Img< ? extends RealType< ? > > img ) { final FloatProcessor fp = new FloatProcessor( (int)img.dimension( 0 ), (int)img.dimension( 1 ) ); final float[] array = (float[])fp.getPixels(); final Cursor< ? extends RealType< ? > > c = img.cursor(); for ( int i = 0; i < array.length; ++ i) array[ i ] = c.next().getRealFloat(); return fp; } public static void main( String[] args ) { // TODO Auto-generated method stub } }