src/ImFilter.jl

Sat, 14 Dec 2019 19:26:33 +0200

author
Tuomo Valkonen <tuomov@iki.fi>
date
Sat, 14 Dec 2019 19:26:33 +0200
changeset 18
0d99f8f7d261
child 22
4403f0445814
permissions
-rw-r--r--

Added ImFilter & simple_imfilter.

##################################################
# 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