@@ -36,6 +36,15 @@ using ImageFiltering: borderinstance
3636 end
3737end
3838
39+ function supported_algs (img, kernel, border)
40+ if eltype (img) isa AbstractFloat
41+ (Algorithm. FIR (), Algorithm. FIRTiled (), Algorithm. FFT (), planned_fft (img, kernel, border))
42+ else
43+ # TODO : extend planned_fft to support other types
44+ (Algorithm. FIR (), Algorithm. FIRTiled (), Algorithm. FFT ())
45+ end
46+ end
47+
3948@testset " FIR/FFT" begin
4049 f32type (img) = f32type (eltype (img))
4150 f32type (:: Type{C} ) where {C<: Colorant } = base_colorant_type (C){Float32}
5059 # Dense inseparable kernel
5160 kern = [0.1 0.2 ; 0.4 0.5 ]
5261 kernel = OffsetArray (kern, - 1 : 0 , 1 : 2 )
62+ border = Inner ()
5363 for img in (imgf, imgi, imgg, imgc)
5464 targetimg = zeros (typeof (img[1 ]* kern[1 ]), size (img))
5565 targetimg[3 : 4 ,2 : 3 ] = rot180 (kern) .* img[3 ,4 ]
6676 @test @inferred (imfilter (f32type (img), img, kernel, border)) ≈ float32 .(targetimg)
6777 fill! (ret, zero (eltype (ret)))
6878 @test @inferred (imfilter! (ret, img, kernel, border)) ≈ targetimg
69- for alg in (Algorithm . FIR (), Algorithm . FIRTiled (), Algorithm . FFT () )
79+ for alg in supported_algs (img, kernel, border )
7080 @test @inferred (imfilter (img, kernel, border, alg)) ≈ targetimg
7181 @test @inferred (imfilter (img, (kernel,), border, alg)) ≈ targetimg
7282 @test @inferred (imfilter (f32type (img), img, kernel, border, alg)) ≈ float32 .(targetimg)
7686 @test_throws MethodError imfilter! (CPU1 (Algorithm. FIR ()), ret, img, kernel, border, Algorithm. FFT ())
7787 end
7888 targetimg_inner = OffsetArray (targetimg[2 : end , 1 : end - 2 ], 2 : 5 , 1 : 5 )
79- @test @inferred (imfilter (img, kernel, Inner () )) ≈ targetimg_inner
80- @test @inferred (imfilter (f32type (img), img, kernel, Inner () )) ≈ float32 .(targetimg_inner)
81- for alg in (Algorithm . FIR (), Algorithm . FIRTiled (), Algorithm . FFT () )
82- @test @inferred (imfilter (img, kernel, Inner () , alg)) ≈ targetimg_inner
83- @test @inferred (imfilter (f32type (img), img, kernel, Inner () , alg)) ≈ float32 .(targetimg_inner)
84- @test @inferred (imfilter (CPU1 (alg), img, kernel, Inner () )) ≈ targetimg_inner
89+ @test @inferred (imfilter (img, kernel, border )) ≈ targetimg_inner
90+ @test @inferred (imfilter (f32type (img), img, kernel, border )) ≈ float32 .(targetimg_inner)
91+ for alg in supported_algs (img, kernel, border )
92+ @test @inferred (imfilter (img, kernel, border , alg)) ≈ targetimg_inner
93+ @test @inferred (imfilter (f32type (img), img, kernel, border , alg)) ≈ float32 .(targetimg_inner)
94+ @test @inferred (imfilter (CPU1 (alg), img, kernel, border )) ≈ targetimg_inner
8595 end
8696 end
8797 # Factored kernel
96106 for border in (" replicate" , " circular" , " symmetric" , " reflect" , Fill (zero (eltype (img))))
97107 @test @inferred (imfilter (img, kernel, border)) ≈ targetimg
98108 @test @inferred (imfilter (f32type (img), img, kernel, border)) ≈ float32 .(targetimg)
99- for alg in (Algorithm . FIR (), Algorithm . FIRTiled (), Algorithm . FFT () )
109+ for alg in supported_algs (img, kernel, border )
100110 @test @inferred (imfilter (img, kernel, border, alg)) ≈ targetimg
101111 @test @inferred (imfilter (f32type (img), img, kernel, border, alg)) ≈ float32 .(targetimg)
102112 end
106116 targetimg_inner = OffsetArray (targetimg[2 : end , 1 : end - 2 ], 2 : 5 , 1 : 5 )
107117 @test @inferred (imfilter (img, kernel, Inner ())) ≈ targetimg_inner
108118 @test @inferred (imfilter (f32type (img), img, kernel, Inner ())) ≈ float32 .(targetimg_inner)
109- for alg in (Algorithm . FIR (), Algorithm . FIRTiled (), Algorithm . FFT () )
119+ for alg in supported_algs (img, kernel, border )
110120 @test @inferred (imfilter (img, kernel, Inner (), alg)) ≈ targetimg_inner
111121 @test @inferred (imfilter (f32type (img), img, kernel, Inner (), alg)) ≈ float32 .(targetimg_inner)
112122 end
122132 for border in (" replicate" , " circular" , " symmetric" , " reflect" , Fill (zero (eltype (img))))
123133 @test @inferred (imfilter (img, kernel, border)) ≈ targetimg
124134 @test @inferred (imfilter (f32type (img), img, kernel, border)) ≈ float32 .(targetimg)
125- for alg in (Algorithm . FIR (), Algorithm . FIRTiled (), Algorithm . FFT () )
135+ for alg in supported_algs (img, kernel, border )
126136 if alg == Algorithm. FFT () && eltype (img) == Int
127137 @test @inferred (imfilter (Float64, img, kernel, border, alg)) ≈ targetimg
128138 else
134144 targetimg_inner = OffsetArray (targetimg[2 : end - 1 , 2 : end - 1 ], 2 : 4 , 2 : 6 )
135145 @test @inferred (imfilter (img, kernel, Inner ())) ≈ targetimg_inner
136146 @test @inferred (imfilter (f32type (img), img, kernel, Inner ())) ≈ float32 .(targetimg_inner)
137- for alg in (Algorithm . FIR (), Algorithm . FIRTiled (), Algorithm . FFT () )
147+ for alg in supported_algs (img, kernel, border )
138148 if alg == Algorithm. FFT () && eltype (img) == Int
139149 @test @inferred (imfilter (Float64, img, kernel, Inner (), alg)) ≈ targetimg_inner
140150 else
184194 targetimg = target1 (img, kern, border)
185195 @test @inferred (imfilter (img, kernel, border)) ≈ targetimg
186196 @test @inferred (imfilter (f32type (img), img, kernel, border)) ≈ float32 .(targetimg)
187- for alg in (Algorithm . FIR (), Algorithm . FIRTiled (), Algorithm . FFT () )
197+ for alg in supported_algs (img, kernel, border )
188198 @test @inferred (imfilter (img, kernel, border, alg)) ≈ targetimg
189199 @test @inferred (imfilter (f32type (img), img, kernel, border, alg)) ≈ float32 .(targetimg)
190200 end
195205 targetimg = zerona! (copy (targetimg0))
196206 @test @inferred (zerona! (imfilter (img, kernel, border))) ≈ targetimg
197207 @test @inferred (zerona! (imfilter (f32type (img), img, kernel, border))) ≈ float32 .(targetimg)
198- for alg in (Algorithm . FIR (), Algorithm . FIRTiled (), Algorithm . FFT () )
208+ for alg in supported_algs (img, kernel, border )
199209 @test @inferred (zerona! (imfilter (img, kernel, border, alg), nanflag)) ≈ targetimg
200210 @test @inferred (zerona! (imfilter (f32type (img), img, kernel, border, alg), nanflag)) ≈ float32 .(targetimg)
201211 end
208218 targetimg = target1 (img, kern, border)
209219 @test @inferred (imfilter (img, kernel, border)) ≈ targetimg
210220 @test @inferred (imfilter (f32type (img), img, kernel, border)) ≈ float32 .(targetimg)
211- for alg in (Algorithm . FIR (), Algorithm . FIRTiled (), Algorithm . FFT () )
221+ for alg in supported_algs (img, kernel, border )
212222 @test @inferred (imfilter (img, kernel, border, alg)) ≈ targetimg
213223 @test @inferred (imfilter (f32type (img), img, kernel, border, alg)) ≈ float32 .(targetimg)
214224 end
219229 targetimg = zerona! (copy (targetimg0))
220230 @test @inferred (zerona! (imfilter (img, kernel, border))) ≈ targetimg
221231 @test @inferred (zerona! (imfilter (f32type (img), img, kernel, border))) ≈ float32 .(targetimg)
222- for alg in (Algorithm . FIR (), Algorithm . FIRTiled (), Algorithm . FFT () )
232+ for alg in supported_algs (img, kernel, border )
223233 @test @inferred (zerona! (imfilter (img, kernel, border, alg), nanflag)) ≈ targetimg
224234 @test @inferred (zerona! (imfilter (f32type (img), img, kernel, border, alg), nanflag)) ≈ float32 .(targetimg)
225235 end
0 commit comments