--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ImFilter.jl Sat Dec 14 19:26:33 2019 +0200 @@ -0,0 +1,58 @@ +################################################## +# Simple (and fast for small filters compared to +# ImageFiltering) image filtering +################################################## + +__precompile__() + +module ImFilter + +using OffsetArrays + +########## +# Exports +########## + +export simple_imfilter + +############## +# The routine +############## + +@inline function inside(i, aʹ, bʹ, a, b) + return (max(a, i - aʹ) - i):(min(b, i + bʹ) - i) +end + +function simple_imfilter(b::Array{Float64,2}, + kernel::OffsetArray{Float64,2,Array{Float64,2}}) + + n, m = size(b) + k, 𝓁 = size(kernel) + o₁, o₂ = kernel.offsets + a₁, a₂ = k + o₁, 𝓁 + o₂ + b₁, b₂ = -1 - o₁, -1 - o₂ + kp = kernel.parent + + @assert(isodd(k) && isodd(𝓁)) + + res = similar(b) + + Threads.@threads for i=1:n + for j=1:m + tmp = 0.0 + it₁ = inside(i, a₁, b₁, 1, n) + it₂ = inside(j, a₂, b₂, 1, m) + for p=it₁ + @simd for q=it₂ + tmp += @inbounds(kp[p-o₁, q-o₂]*b[i+p,j+q]) + end + end + res[i, j] = tmp + end + end + + return res +end + +end # Module +