private static < T extends NumericType< T > & NativeType< T > > void convolveNativeType( final double[][] halfkernels, final RandomAccessible< T > source, final RandomAccessibleInterval< T > target, final int numThreads ) { final T type = Util.getTypeFromInterval( target ); final ConvolverFactory< T, T > convfac; if ( canUseBufferedConvolver( target, halfkernels ) ) convfac = ConvolverNativeTypeBuffered.factory( type ); else convfac = ConvolverNativeType.factory( type ); final ImgFactory< T > imgfac = getImgFactory( target, halfkernels, type ); convolve( halfkernels, source, target, convfac, convfac, convfac, convfac, imgfac, type, numThreads ); }
public static < S, T > void convolve1d( final double[] halfkernel, final RandomAccessible< S > source, final RandomAccessibleInterval< T > target, final ConvolverFactory< S, T > convolverFactoryST ) { final long[] sourceOffset = new long[] { 1 - halfkernel.length }; convolveOffset( halfkernel, source, sourceOffset, target, target, 0, convolverFactoryST, 1, 1 ); }
final S sourceType = getType( source, target ); if ( targetType instanceof RealType ) convolveRealTypeDouble( halfkernels, ( RandomAccessible ) source, ( RandomAccessibleInterval ) target, numThreads ); else convolveRealTypeFloat( halfkernels, ( RandomAccessible ) source, ( RandomAccessibleInterval ) target, numThreads ); throw new IncompatibleTypeException( sourceType, targetType.getClass().getCanonicalName() + " source required for convolving into a " + targetType.getClass().getCanonicalName() + " target" ); if ( targetType instanceof NativeType ) convolveNativeType( halfkernels, ( RandomAccessible ) source, ( RandomAccessibleInterval ) target, numThreads ); else convolveNumericType( halfkernels, ( RandomAccessible ) source, ( RandomAccessibleInterval ) target, numThreads );
if ( n == 1 ) convolve1d( halfkernels[ 0 ], source, target, convolverFactoryST, service ); final long[][] tmpdims = getTempImageDimensions( target, halfkernels ); Img< I > tmp1 = imgFactory.create( tmpdims[ 0 ] ); if ( n == 2 ) convolveOffset( halfkernels[ 0 ], source, sourceOffset, tmp1, tmp1, 0, convolverFactorySI, service, numTasks ); convolveOffset( halfkernels[ 1 ], tmp1, targetOffset, target, target, 1, convolverFactoryIT, service, numTasks ); convolveOffset( halfkernels[ 0 ], source, sourceOffset, tmp1, new FinalInterval( tmpdims[ 0 ] ), 0, convolverFactorySI, service, numTasks ); for ( int d = 1; d < n - 1; ++d ) convolveOffset( halfkernels[ d ], tmp1, zeroOffset, tmp2, new FinalInterval( tmpdims[ d ] ), d, convolverFactoryII, service, numTasks ); final Img< I > tmp = tmp2; tmp2 = tmp1; tmp1 = tmp; convolveOffset( halfkernels[ n - 1 ], tmp1, targetOffset, target, target, n - 1, convolverFactoryIT, service, numTasks ); final ExecutorService service ) convolve( halfkernels, source, target, convolverFactorySI, convolverFactoryII, convolverFactoryIT, convolverFactoryST, imgFactory.imgFactory( type ), service );
if ( n == 1 ) convolve1d( halfkernels[ 0 ], source, target, convolverFactoryST ); final long[][] tmpdims = getTempImageDimensions( target, halfkernels ); Img< I > tmp1 = imgFactory.create( tmpdims[ 0 ], type ); if ( n == 2 ) convolveOffset( halfkernels[ 0 ], source, sourceOffset, tmp1, tmp1, 0, convolverFactorySI, numThreads, numTasks ); convolveOffset( halfkernels[ 1 ], tmp1, targetOffset, target, target, 1, convolverFactoryIT, numThreads, numTasks ); convolveOffset( halfkernels[ 0 ], source, sourceOffset, tmp1, new FinalInterval( tmpdims[ 0 ] ), 0, convolverFactorySI, numThreads, numTasks ); for( int d = 1; d < n - 1; ++d ) convolveOffset( halfkernels[ d ], tmp1, zeroOffset, tmp2, new FinalInterval( tmpdims[ d ] ), d, convolverFactoryII, numThreads, numTasks ); final Img< I > tmp = tmp2; tmp2 = tmp1; tmp1 = tmp; convolveOffset( halfkernels[ n - 1 ], tmp1, targetOffset, target, target, n - 1, convolverFactoryIT, numThreads, numTasks );
@Override public void compute(final RandomAccessible<T> input, final RandomAccessibleInterval<T> output) { try { SeparableSymmetricConvolution.convolve(Gauss3.halfkernels(sigmas), input, output, threads.getExecutorService()); } catch (final IncompatibleTypeException e) { throw new RuntimeException(e); } }
static < T extends NativeType< T > > ImgFactory< T > getImgFactory( final Dimensions targetsize, final double[][] halfkernels, final T type ) { if ( canUseArrayImgFactory( targetsize, halfkernels ) ) return new ArrayImgFactory< T >(); final int cellSize = ( int ) Math.pow( Integer.MAX_VALUE / type.getEntitiesPerPixel(), 1.0 / targetsize.numDimensions() ); return new CellImgFactory< T >( cellSize ); } }
final S sourceType = getType( source, target ); if ( targetType instanceof RealType ) convolveRealTypeDouble( halfkernels, ( RandomAccessible ) source, ( RandomAccessibleInterval ) target, service ); else convolveRealTypeFloat( halfkernels, ( RandomAccessible ) source, ( RandomAccessibleInterval ) target, service ); throw new IncompatibleTypeException( sourceType, targetType.getClass().getCanonicalName() + " source required for convolving into a " + targetType.getClass().getCanonicalName() + " target" ); if ( targetType instanceof NativeType ) convolveNativeType( halfkernels, ( RandomAccessible ) source, ( RandomAccessibleInterval ) target, service ); else convolveNumericType( halfkernels, ( RandomAccessible ) source, ( RandomAccessibleInterval ) target, service );
SeparableSymmetricConvolution.convolve( halfkernels, source, target, numthreads );
static < T extends NativeType< T > > ImgFactory< T > getImgFactory( final Dimensions targetsize, final double[][] halfkernels, final T type ) { if ( canUseArrayImgFactory( targetsize, halfkernels ) ) return new ArrayImgFactory<>( type ); final int cellSize = ( int ) Math.pow( Integer.MAX_VALUE / type.getEntitiesPerPixel().getRatio(), 1.0 / targetsize.numDimensions() ); return new CellImgFactory<>( type, cellSize ); }
private static < T extends NumericType< T > & NativeType< T > > void convolveNativeType( final double[][] halfkernels, final RandomAccessible< T > source, final RandomAccessibleInterval< T > target, final ExecutorService service ) { final T type = Util.getTypeFromInterval( target ); final ConvolverFactory< T, T > convfac; if ( canUseBufferedConvolver( target, halfkernels ) ) convfac = ConvolverNativeTypeBuffered.factory( type ); else convfac = ConvolverNativeType.factory( type ); final ImgFactory< T > imgfac = getImgFactory( target, halfkernels, type ); convolve( halfkernels, source, target, convfac, convfac, convfac, convfac, imgfac, service ); }
private static < T extends NumericType< T > > void convolveNumericType( final double[][] halfkernels, final RandomAccessible< T > source, final RandomAccessibleInterval< T > target, final ExecutorService service ) { final T type = Util.getTypeFromInterval( target ); final ConvolverFactory< T, T > convfac = ConvolverNumericType.factory( type ); convolve( halfkernels, source, target, convfac, convfac, convfac, convfac, new ListImgFactory<>( type ), service ); }
/** * @deprecated Use {@link net.imglib2.algorithm.convolution.kernel.SeparableKernelConvolution#convolution1d} */ @Deprecated public static < S, T > void convolve1d( final double[] halfkernel, final RandomAccessible< S > source, final RandomAccessibleInterval< T > target, final ConvolverFactory< S, T > convolverFactoryST, final ExecutorService service ) { final long[] sourceOffset = new long[] { 1 - halfkernel.length }; convolveOffset( halfkernel, source, sourceOffset, target, target, 0, convolverFactoryST, service, 1 ); }
private static < S extends RealType< S >, T extends RealType< T > > void convolveRealTypeDouble( final double[][] halfkernels, final RandomAccessible< S > source, final RandomAccessibleInterval< T > target, final ExecutorService service ) { final DoubleType type = new DoubleType(); final ImgFactory< DoubleType > imgfac = getImgFactory( target, halfkernels, type ); if ( canUseBufferedConvolver( target, halfkernels ) ) convolve( halfkernels, source, target, DoubleConvolverRealTypeBuffered.< S, DoubleType >factory(), DoubleConvolverRealTypeBuffered.< DoubleType, DoubleType >factory(), DoubleConvolverRealTypeBuffered.< DoubleType, T >factory(), DoubleConvolverRealTypeBuffered.< S, T >factory(), imgfac, service ); else convolve( halfkernels, source, target, DoubleConvolverRealType.< S, DoubleType >factory(), DoubleConvolverRealType.< DoubleType, DoubleType >factory(), DoubleConvolverRealType.< DoubleType, T >factory(), DoubleConvolverRealType.< S, T >factory(), imgfac, service ); }
private static < T extends NumericType< T > > void convolveNumericType( final double[][] halfkernels, final RandomAccessible< T > source, final RandomAccessibleInterval< T > target, final int numThreads ) { final T type = Util.getTypeFromInterval( target ); final ConvolverFactory< T, T > convfac = ConvolverNumericType.factory( type ); convolve( halfkernels, source, target, convfac, convfac, convfac, convfac, new ListImgFactory< T >(), type, numThreads ); }
private static < S extends RealType< S >, T extends RealType< T > > void convolveRealTypeFloat( final double[][] halfkernels, final RandomAccessible< S > source, final RandomAccessibleInterval< T > target, final int numThreads ) { final FloatType type = new FloatType(); final ImgFactory< FloatType > imgfac = getImgFactory( target, halfkernels, type ); if ( canUseBufferedConvolver( target, halfkernels ) ) convolve( halfkernels, source, target, FloatConvolverRealTypeBuffered.< S, FloatType >factory(), FloatConvolverRealTypeBuffered.< FloatType, FloatType >factory(), FloatConvolverRealTypeBuffered.< FloatType, T >factory(), FloatConvolverRealTypeBuffered.< S, T >factory(), imgfac, type, numThreads ); else convolve( halfkernels, source, target, FloatConvolverRealType.< S, FloatType >factory(), FloatConvolverRealType.< FloatType, FloatType >factory(), FloatConvolverRealType.< FloatType, T >factory(), FloatConvolverRealType.< S, T >factory(), imgfac, type, numThreads ); }
@Override public void compute(final RandomAccessibleInterval<T> input, final RandomAccessibleInterval<T> output) { if (outOfBounds == null) { outOfBounds = new OutOfBoundsMirrorFactory<>(Boundary.SINGLE); } final RandomAccessible<FloatType> eIn = // (RandomAccessible) Views.extend(input, outOfBounds); try { SeparableSymmetricConvolution.convolve(Gauss3.halfkernels(sigmas), eIn, output, threads.getExecutorService()); } catch (final IncompatibleTypeException e) { throw new RuntimeException(e); } }
private static < S extends RealType< S >, T extends RealType< T > > void convolveRealTypeDouble( final double[][] halfkernels, final RandomAccessible< S > source, final RandomAccessibleInterval< T > target, final int numThreads ) { final DoubleType type = new DoubleType(); final ImgFactory< DoubleType > imgfac = getImgFactory( target, halfkernels, type ); if ( canUseBufferedConvolver( target, halfkernels ) ) convolve( halfkernels, source, target, DoubleConvolverRealTypeBuffered.< S, DoubleType >factory(), DoubleConvolverRealTypeBuffered.< DoubleType, DoubleType >factory(), DoubleConvolverRealTypeBuffered.< DoubleType, T >factory(), DoubleConvolverRealTypeBuffered.< S, T >factory(), imgfac, type, numThreads ); else convolve( halfkernels, source, target, DoubleConvolverRealType.< S, DoubleType >factory(), DoubleConvolverRealType.< DoubleType, DoubleType >factory(), DoubleConvolverRealType.< DoubleType, T >factory(), DoubleConvolverRealType.< S, T >factory(), imgfac, type, numThreads ); }
private static < S extends RealType< S >, T extends RealType< T > > void convolveRealTypeFloat( final double[][] halfkernels, final RandomAccessible< S > source, final RandomAccessibleInterval< T > target, final ExecutorService service ) { final FloatType type = new FloatType(); final ImgFactory< FloatType > imgfac = getImgFactory( target, halfkernels, type ); if ( canUseBufferedConvolver( target, halfkernels ) ) convolve( halfkernels, source, target, FloatConvolverRealTypeBuffered.< S, FloatType >factory(), FloatConvolverRealTypeBuffered.< FloatType, FloatType >factory(), FloatConvolverRealTypeBuffered.< FloatType, T >factory(), FloatConvolverRealTypeBuffered.< S, T >factory(), imgfac, service ); else convolve( halfkernels, source, target, FloatConvolverRealType.< S, FloatType >factory(), FloatConvolverRealType.< FloatType, FloatType >factory(), FloatConvolverRealType.< FloatType, T >factory(), FloatConvolverRealType.< S, T >factory(), imgfac, service ); }