@Override public IntervalView<T> calculate(RandomAccessible<T> input) { return Views.unshear(input, interval, shearDimension, referenceDimension); } }
@Override public TransformView<T> calculate(RandomAccessible<T> input) { return Views.unshear(input, shearDimension, referenceDimension); }
/** * Negative shear transform of a RandomAccessible using * {@link InverseShearTransform}, i.e. c[ shearDimension ] = c[ * shearDimension ] - c[ referenceDimension ] * * @param source * input, e.g. extended {@link RandomAccessibleInterval} * @param interval * original interval * @param shearDimension * dimension to be sheared * @param referenceDimension * reference dimension for shear * * @return {@link IntervalView} containing the result. The returned * interval's dimension are determined by applying the * {@link ShearTransform#transform} method on the input interval. */ public static < T > IntervalView< T > unshear( final RandomAccessible< T > source, final Interval interval, final int shearDimension, final int referenceDimension ) { final InverseShearTransform transform = new InverseShearTransform( source.numDimensions(), shearDimension, referenceDimension ); return Views.interval( Views.unshear( source, shearDimension, referenceDimension ), transform.transform( new BoundingBox( interval ) ).getInterval() ); }
/** * Negative shear transform of a RandomAccessible using * {@link InverseShearTransform}, i.e. c[ shearDimension ] = c[ * shearDimension ] - c[ referenceDimension ] * * @param source * input, e.g. extended {@link RandomAccessibleInterval} * @param interval * original interval * @param shearDimension * dimension to be sheared * @param referenceDimension * reference dimension for shear * * @return {@link IntervalView} containing the result. The returned * interval's dimension are determined by applying the * {@link ShearTransform#transform} method on the input interval. */ public static < T > IntervalView< T > unshear( final RandomAccessible< T > source, final Interval interval, final int shearDimension, final int referenceDimension ) { final InverseShearTransform transform = new InverseShearTransform( source.numDimensions(), shearDimension, referenceDimension ); return Views.interval( Views.unshear( source, shearDimension, referenceDimension ), transform.transform( new BoundingBox( interval ) ).getInterval() ); }
@Test public void UnshearIntervalTest() { Img<DoubleType> img = new ArrayImgFactory<DoubleType>().create(new int[] { 2, 2 }, new DoubleType()); Cursor<DoubleType> imgC = img.cursor(); while (imgC.hasNext()) { imgC.next().set(1); } Cursor<DoubleType> il2 = Views .unshear(Views.shear(Views.extendZero(img), 0, 1), new FinalInterval(new long[] { 0, 0 }, new long[] { 3, 3 }), 0, 1) .cursor(); RandomAccess<DoubleType> opr = ops.transform() .unshearView(Views.shear(Views.extendZero(img), 0, 1), new FinalInterval(new long[] { 0, 0 }, new long[] { 3, 3 }), 0, 1) .randomAccess(); while (il2.hasNext()) { il2.next(); opr.setPosition(il2); assertEquals(il2.get().get(), opr.get().get(), 1e-10); } } }
@Test public void defaultUnshearTest() { Img<DoubleType> img = new ArrayImgFactory<DoubleType>().create(new int[] { 2, 2 }, new DoubleType()); Cursor<DoubleType> imgC = img.cursor(); while (imgC.hasNext()) { imgC.next().set(1); } TransformView<DoubleType> il2 = Views.unshear(Views.shear(Views.extendZero(img), 0, 1), 0, 1); TransformView<DoubleType> opr = ops.transform().unshearView(Views.shear(Views.extendZero(img), 0, 1), 0, 1); Cursor<DoubleType> il2C = Views.interval(il2, new FinalInterval(new long[] { 0, 0 }, new long[] { 3, 3 })) .cursor(); RandomAccess<DoubleType> oprRA = Views .interval(opr, new FinalInterval(new long[] { 0, 0 }, new long[] { 3, 3 })).randomAccess(); while (il2C.hasNext()) { il2C.next(); oprRA.setPosition(il2C); assertEquals(il2C.get().get(), oprRA.get().get(), 1e-10); } }
iv.transform( boundingBox ); IntervalView<FloatType> viewTransformed = Views.unshear( extended, img, target, source );