src/ImFilter.jl

changeset 18
0d99f8f7d261
child 22
4403f0445814
--- /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
+

mercurial