Skip to content

Commit 3d0b19c

Browse files
elevansgselzer
authored andcommitted
Create a proper "filter.fft" function op
Running `out = ops.op("filter.fft").arity1().input(img).apply()` returns a blank image. This is because the wrong image dimensions are being used for the FFT result. This is an example of when adaptation fails. SciJava Ops adapts the FFT Op into a function and assumes that the output image dimensions are the same as the input. Generally this is a safe assumption, but this is an example where the output image dimensions are in fact different. This commit adds a new Op that depends on `FFTMethodsOpF` and returns the FFT result as a ComplexFloatType. This is consistent with the old imagej-ops usage.
1 parent ed80f91 commit 3d0b19c

File tree

2 files changed

+76
-1
lines changed

2 files changed

+76
-1
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/*
2+
* #%L
3+
* ImageJ2 software for multidimensional image processing and analysis.
4+
* %%
5+
* Copyright (C) 2014 - 2023 ImageJ2 developers.
6+
* %%
7+
* Redistribution and use in source and binary forms, with or without
8+
* modification, are permitted provided that the following conditions are met:
9+
*
10+
* 1. Redistributions of source code must retain the above copyright notice,
11+
* this list of conditions and the following disclaimer.
12+
* 2. Redistributions in binary form must reproduce the above copyright notice,
13+
* this list of conditions and the following disclaimer in the documentation
14+
* and/or other materials provided with the distribution.
15+
*
16+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
20+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26+
* POSSIBILITY OF SUCH DAMAGE.
27+
* #L%
28+
*/
29+
30+
package org.scijava.ops.image.filter.fft;
31+
32+
import net.imglib2.RandomAccessibleInterval;
33+
import net.imglib2.type.numeric.RealType;
34+
import net.imglib2.type.numeric.complex.ComplexFloatType;
35+
import org.scijava.function.Functions;
36+
import org.scijava.ops.spi.Nullable;
37+
import org.scijava.ops.spi.OpDependency;
38+
39+
/**
40+
* Function that uses FFTMethods to perform a forward FFT
41+
*
42+
* @author Brian Northan
43+
* @param <T> TODO Documentation
44+
*/
45+
public class FFTMethodsOp<T extends RealType<T>> {
46+
47+
/**
48+
* Note that if fast is true the input will be extended to the next fast FFT
49+
* size. If false the input will be computed using the original input
50+
* dimensions (if possible). If the input dimensions are not supported by the
51+
* underlying FFT implementation the input will be extended to the nearest
52+
* size that is supported. TODO
53+
*
54+
* @param FFTMethodsOpF dependency to FFTMethodsOpF
55+
* @param input input image
56+
* @param borderSize the size of border to apply in each dimension
57+
* @param fast whether to perform a fast FFT; default true
58+
* @return the output
59+
* @implNote op names='filter.fft', priority='100.'
60+
*/
61+
62+
public static <T extends RealType<T>>
63+
RandomAccessibleInterval<ComplexFloatType> run( //
64+
@OpDependency(
65+
name = "filter.fft") Functions.Arity4<RandomAccessibleInterval<T>, ComplexFloatType, long[], Boolean, RandomAccessibleInterval<ComplexFloatType>> FFTMethodsOpF,
66+
final RandomAccessibleInterval<T> input, //
67+
@Nullable long[] borderSize, //
68+
@Nullable Boolean fast //
69+
) {
70+
71+
return FFTMethodsOpF.apply(input, new ComplexFloatType(), borderSize, fast);
72+
73+
}
74+
75+
}

scijava-ops-image/src/test/java/org/scijava/ops/image/OpRegressionTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public class OpRegressionTest {
4242

4343
@Test
4444
public void testOpDiscoveryRegression() {
45-
long expected = 1964;
45+
long expected = 1965;
4646
long actual = ops.infos().size();
4747
assertEquals(expected, actual);
4848
}

0 commit comments

Comments
 (0)