Sat, 14 Dec 2019 23:56:21 +0200
Small possible optimisations
################################################## # 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