@@ -36,6 +36,15 @@ using ImageFiltering: borderinstance
36
36
end
37
37
end
38
38
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
+
39
48
@testset " FIR/FFT" begin
40
49
f32type (img) = f32type (eltype (img))
41
50
f32type (:: Type{C} ) where {C<: Colorant } = base_colorant_type (C){Float32}
50
59
# Dense inseparable kernel
51
60
kern = [0.1 0.2 ; 0.4 0.5 ]
52
61
kernel = OffsetArray (kern, - 1 : 0 , 1 : 2 )
62
+ border = Inner ()
53
63
for img in (imgf, imgi, imgg, imgc)
54
64
targetimg = zeros (typeof (img[1 ]* kern[1 ]), size (img))
55
65
targetimg[3 : 4 ,2 : 3 ] = rot180 (kern) .* img[3 ,4 ]
66
76
@test @inferred (imfilter (f32type (img), img, kernel, border)) ≈ float32 .(targetimg)
67
77
fill! (ret, zero (eltype (ret)))
68
78
@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 )
70
80
@test @inferred (imfilter (img, kernel, border, alg)) ≈ targetimg
71
81
@test @inferred (imfilter (img, (kernel,), border, alg)) ≈ targetimg
72
82
@test @inferred (imfilter (f32type (img), img, kernel, border, alg)) ≈ float32 .(targetimg)
76
86
@test_throws MethodError imfilter! (CPU1 (Algorithm. FIR ()), ret, img, kernel, border, Algorithm. FFT ())
77
87
end
78
88
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
85
95
end
86
96
end
87
97
# Factored kernel
96
106
for border in (" replicate" , " circular" , " symmetric" , " reflect" , Fill (zero (eltype (img))))
97
107
@test @inferred (imfilter (img, kernel, border)) ≈ targetimg
98
108
@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 )
100
110
@test @inferred (imfilter (img, kernel, border, alg)) ≈ targetimg
101
111
@test @inferred (imfilter (f32type (img), img, kernel, border, alg)) ≈ float32 .(targetimg)
102
112
end
106
116
targetimg_inner = OffsetArray (targetimg[2 : end , 1 : end - 2 ], 2 : 5 , 1 : 5 )
107
117
@test @inferred (imfilter (img, kernel, Inner ())) ≈ targetimg_inner
108
118
@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 )
110
120
@test @inferred (imfilter (img, kernel, Inner (), alg)) ≈ targetimg_inner
111
121
@test @inferred (imfilter (f32type (img), img, kernel, Inner (), alg)) ≈ float32 .(targetimg_inner)
112
122
end
122
132
for border in (" replicate" , " circular" , " symmetric" , " reflect" , Fill (zero (eltype (img))))
123
133
@test @inferred (imfilter (img, kernel, border)) ≈ targetimg
124
134
@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 )
126
136
if alg == Algorithm. FFT () && eltype (img) == Int
127
137
@test @inferred (imfilter (Float64, img, kernel, border, alg)) ≈ targetimg
128
138
else
134
144
targetimg_inner = OffsetArray (targetimg[2 : end - 1 , 2 : end - 1 ], 2 : 4 , 2 : 6 )
135
145
@test @inferred (imfilter (img, kernel, Inner ())) ≈ targetimg_inner
136
146
@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 )
138
148
if alg == Algorithm. FFT () && eltype (img) == Int
139
149
@test @inferred (imfilter (Float64, img, kernel, Inner (), alg)) ≈ targetimg_inner
140
150
else
184
194
targetimg = target1 (img, kern, border)
185
195
@test @inferred (imfilter (img, kernel, border)) ≈ targetimg
186
196
@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 )
188
198
@test @inferred (imfilter (img, kernel, border, alg)) ≈ targetimg
189
199
@test @inferred (imfilter (f32type (img), img, kernel, border, alg)) ≈ float32 .(targetimg)
190
200
end
195
205
targetimg = zerona! (copy (targetimg0))
196
206
@test @inferred (zerona! (imfilter (img, kernel, border))) ≈ targetimg
197
207
@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 )
199
209
@test @inferred (zerona! (imfilter (img, kernel, border, alg), nanflag)) ≈ targetimg
200
210
@test @inferred (zerona! (imfilter (f32type (img), img, kernel, border, alg), nanflag)) ≈ float32 .(targetimg)
201
211
end
208
218
targetimg = target1 (img, kern, border)
209
219
@test @inferred (imfilter (img, kernel, border)) ≈ targetimg
210
220
@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 )
212
222
@test @inferred (imfilter (img, kernel, border, alg)) ≈ targetimg
213
223
@test @inferred (imfilter (f32type (img), img, kernel, border, alg)) ≈ float32 .(targetimg)
214
224
end
219
229
targetimg = zerona! (copy (targetimg0))
220
230
@test @inferred (zerona! (imfilter (img, kernel, border))) ≈ targetimg
221
231
@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 )
223
233
@test @inferred (zerona! (imfilter (img, kernel, border, alg), nanflag)) ≈ targetimg
224
234
@test @inferred (zerona! (imfilter (f32type (img), img, kernel, border, alg), nanflag)) ≈ float32 .(targetimg)
225
235
end
0 commit comments