src/ImFilter.jl

changeset 32
41d13bf7d637
parent 30
0b25d9ef7af9
child 48
1b9e90ca81e3
equal deleted inserted replaced
31:62645d05985a 32:41d13bf7d637
6 __precompile__() 6 __precompile__()
7 7
8 module ImFilter 8 module ImFilter
9 9
10 using OffsetArrays 10 using OffsetArrays
11 using AlgTools.Util: @threadsif
11 12
12 ########## 13 ##########
13 # Exports 14 # Exports
14 ########## 15 ##########
15 16
23 @inline function inside(i, aʹ, bʹ, a, b) 24 @inline function inside(i, aʹ, bʹ, a, b)
24 return (max(a, i - aʹ) - i):(min(b, i + bʹ) - i) 25 return (max(a, i - aʹ) - i):(min(b, i + bʹ) - i)
25 end 26 end
26 27
27 function simple_imfilter(b::Array{Float64,2}, 28 function simple_imfilter(b::Array{Float64,2},
28 kernel::OffsetArray{Float64,2,Array{Float64,2}}) 29 kernel::OffsetArray{Float64,2,Array{Float64,2}};
30 threads::Bool=true)
29 31
30 n, m = size(b) 32 n, m = size(b)
31 k, 𝓁 = size(kernel) 33 k, 𝓁 = size(kernel)
32 o₁, o₂ = kernel.offsets 34 o₁, o₂ = kernel.offsets
33 a₁, a₂ = k + o₁, 𝓁 + o₂ 35 a₁, a₂ = k + o₁, 𝓁 + o₂
36 38
37 @assert(isodd(k) && isodd(𝓁)) 39 @assert(isodd(k) && isodd(𝓁))
38 40
39 res = similar(b) 41 res = similar(b)
40 42
41 Threads.@threads for i=1:n 43 @threadsif threads for i=1:n
42 @inbounds for j=1:m 44 @inbounds for j=1:m
43 tmp = 0.0 45 tmp = 0.0
44 it₁ = inside(i, a₁, b₁, 1, n) 46 it₁ = inside(i, a₁, b₁, 1, n)
45 it₂ = inside(j, a₂, b₂, 1, m) 47 it₂ = inside(j, a₂, b₂, 1, m)
46 for p=it₁ 48 for p=it₁

mercurial