diff --git a/src/test/java/net/imglib2/algorithm/blocks/downsample/DownsampleBdvPlayground2.java b/src/test/java/net/imglib2/algorithm/blocks/downsample/DownsampleBdvPlayground2.java new file mode 100644 index 000000000..f5bffcabe --- /dev/null +++ b/src/test/java/net/imglib2/algorithm/blocks/downsample/DownsampleBdvPlayground2.java @@ -0,0 +1,105 @@ +/*- + * #%L + * ImgLib2: a general-purpose, multidimensional image processing library. + * %% + * Copyright (C) 2009 - 2024 Tobias Pietzsch, Stephan Preibisch, Stephan Saalfeld, + * John Bogovic, Albert Cardona, Barry DeZonia, Christian Dietz, Jan Funke, + * Aivar Grislis, Jonathan Hale, Grant Harris, Stefan Helfrich, Mark Hiner, + * Martin Horn, Steffen Jaensch, Lee Kamentsky, Larry Lindsey, Melissa Linkert, + * Mark Longair, Brian Northan, Nick Perry, Curtis Rueden, Johannes Schindelin, + * Jean-Yves Tinevez and Michael Zinsmaier. + * %% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * #L% + */ +package net.imglib2.algorithm.blocks.downsample; + +import java.util.Arrays; + +import bdv.cache.SharedQueue; +import bdv.util.Bdv; +import bdv.util.BdvFunctions; +import bdv.util.BdvSource; +import bdv.util.volatiles.VolatileViews; +import bdv.viewer.DisplayMode; +import ij.IJ; +import ij.ImagePlus; +import net.imglib2.algorithm.blocks.BlockAlgoUtils; +import net.imglib2.algorithm.blocks.BlockSupplier; +import net.imglib2.algorithm.blocks.UnaryBlockOperator; +import net.imglib2.algorithm.blocks.convert.Convert; +import net.imglib2.algorithm.blocks.downsample.Downsample.Offset; +import net.imglib2.cache.img.CachedCellImg; +import net.imglib2.img.Img; +import net.imglib2.img.display.imagej.ImageJFunctions; +import net.imglib2.type.numeric.ARGBType; +import net.imglib2.type.numeric.integer.UnsignedByteType; +import net.imglib2.view.Views; + +public class DownsampleBdvPlayground2 +{ + public static void main( String[] args ) + { + System.setProperty("apple.laf.useScreenMenuBar", "true"); + + final String fn = "/Users/pietzsch/workspace/data/e002_stack_fused-8bit.tif"; + final ImagePlus imp = IJ.openImage( fn ); + final Img< UnsignedByteType > img = ImageJFunctions.wrapByte( imp ); + + final BdvSource bdv = BdvFunctions.show( + img, + "img", + Bdv.options() ); + bdv.setColor( new ARGBType( 0xffffff ) ); + bdv.setDisplayRange( 0, 255 ); + bdv.getBdvHandle().getViewerPanel().setDisplayMode( DisplayMode.SINGLE ); + + final boolean[] downsampleInDim = { true, true, true }; + final long[] downsampledDimensions = Downsample.getDownsampledDimensions( img.dimensionsAsLongArray(), downsampleInDim ); + final int[] cellDimensions = { 64, 64, 64 }; + + final double[] calib = new double[ 3 ]; + Arrays.setAll(calib, d -> downsampleInDim[ d ] ? 2 : 1 ); + + final BlockSupplier< UnsignedByteType > blocks = BlockSupplier + .of( Views.extendMirrorDouble( img ) ) + .andThen( Downsample.downsample( + img.getType(), + Offset.HALF_PIXEL, + img.numDimensions() ) ); + + final Img< UnsignedByteType > downsampled = BlockAlgoUtils.cellImg( + blocks, + downsampledDimensions, + cellDimensions ); + + final BdvSource out = BdvFunctions.show( + VolatileViews.wrapAsVolatile( downsampled, new SharedQueue( 32, 1 ) ), + "downsampled half-pixel", + Bdv.options() + .addTo( bdv ) + .sourceTransform( calib ) + ); + out.setDisplayRange( 0, 255 ); + out.setColor( new ARGBType( 0x00ff00 ) ); + } +} diff --git a/src/test/java/net/imglib2/algorithm/blocks/downsample/DownsampleDoublePlayground.java b/src/test/java/net/imglib2/algorithm/blocks/downsample/DownsampleDoublePlayground.java index a87610a16..f894b9b48 100644 --- a/src/test/java/net/imglib2/algorithm/blocks/downsample/DownsampleDoublePlayground.java +++ b/src/test/java/net/imglib2/algorithm/blocks/downsample/DownsampleDoublePlayground.java @@ -41,6 +41,8 @@ import ij.IJ; import ij.ImagePlus; import java.util.Arrays; + +import net.imglib2.algorithm.blocks.BlockSupplier; import net.imglib2.algorithm.blocks.downsample.DownsampleBlockProcessors.CenterDouble; import net.imglib2.algorithm.blocks.downsample.DownsampleBlockProcessors.HalfPixelDouble; import net.imglib2.algorithm.blocks.BlockAlgoUtils; @@ -73,15 +75,20 @@ public static void main( String[] args ) bdv.setDisplayRange( 0, 255 ); bdv.getBdvHandle().getViewerPanel().setDisplayMode( DisplayMode.SINGLE ); - final PrimitiveBlocks< DoubleType > blocks = PrimitiveBlocks.of( - Converters.convert( Views.extendBorder( img ), new RealDoubleConverter<>(), new DoubleType() ) - ).threadSafe(); + final BlockSupplier< DoubleType > blocks = BlockSupplier.of( + Converters.convert( Views.extendBorder( img ), new RealDoubleConverter<>(), new DoubleType() ) ); final boolean[] downsampleInDim = { true, true, true }; final long[] downsampledDimensions = Downsample.getDownsampledDimensions( img.dimensionsAsLongArray(), downsampleInDim ); final int[] cellDimensions = { 64, 64, 64 }; final CachedCellImg< DoubleType, ? > downsampled = BlockAlgoUtils.cellImg( - blocks, new CenterDouble( downsampleInDim ), new DoubleType(), downsampledDimensions, cellDimensions ); + blocks.andThen( Downsample.downsample( + new DoubleType(), + Downsample.ComputationType.DOUBLE, + Downsample.Offset.CENTERED, + 3 ) + ), + downsampledDimensions, cellDimensions ); final double[] calib = new double[ 3 ]; Arrays.setAll(calib, d -> downsampleInDim[ d ] ? 2 : 1 ); @@ -95,7 +102,13 @@ public static void main( String[] args ) // out.setColor( new ARGBType( 0xff0000 ) ); final CachedCellImg< DoubleType, ? > downsampled2 = BlockAlgoUtils.cellImg( - blocks, new HalfPixelDouble( downsampleInDim ), new DoubleType(), downsampledDimensions, cellDimensions ); + blocks.andThen( Downsample.downsample( + new DoubleType(), + Downsample.ComputationType.DOUBLE, + Downsample.Offset.HALF_PIXEL, + 3 ) + ), + downsampledDimensions, cellDimensions ); final BdvSource out2 = BdvFunctions.show( VolatileViews.wrapAsVolatile( downsampled2 ), "downsampled half-pixel",