JuliaImages / ImageFiltering.jl

Julia implementations of multidimensional array convolution and nonlinear stencil operations
Other
99 stars 49 forks source link

`imfilter` with `KernelFactors.IIRGaussian()` and `OffsetArray` causes bounds error #82

Closed zygmuntszpak closed 5 years ago

zygmuntszpak commented 5 years ago
using Images, TestImages, ImageFiltering, OffsetArrays

img1 = Gray{Float64}.(testimage("mandrill"))
img2 = OffsetArray(img1, 3, 0)
sigma = 1.0
N = 2
kerng = KernelFactors.IIRGaussian(sigma)
kern = ntuple(d->kerng, Val(N))

# Error
img_smoothed_main = imfilter(img2, kern, NA())

The error is:

julia> img_smoothed_main = imfilter(img2, kern, NA())
ERROR: BoundsError: attempt to access Base.Slice{UnitRange{Int64}} with indices 4:515 at index [1:3]
Stacktrace:
 [1] throw_boundserror(::Base.Slice{UnitRange{Int64}}, ::Tuple{UnitRange{Int64}}) at ./abstractarray.jl:492
 [2] checkbounds at ./abstractarray.jl:457 [inlined]
 [3] getindex at ./indices.jl:302 [inlined]
 [4] _imfilter_dim!(::ComputationalResources.CPU1{ImageFiltering.Algorithm.IIR}, ::OffsetArray{Gray{Float64},2,Array{Gray{Float64},2}}, ::OffsetArray{Gray{Float64},2,Array{Gray{Float64},2}}, ::ImageFiltering.KernelFactors.TriggsSdika{Float64,3,3,9}, ::CartesianIndices{0,Tuple{}}, ::Base.Slice{UnitRange{Int64}}, ::CartesianIndices{1,Tuple{Base.Slice{UnitRange{Int64}}}}, ::Fill{Gray{Float64},0}) at /home/zygmunt/.julia/packages/ImageFiltering/bMda8/src/imfilter.jl:1306
 [5] _imfilter_inplace_tuple! at /home/zygmunt/.julia/packages/ImageFiltering/bMda8/src/imfilter.jl:1269 [inlined]
 [6] imfilter!(::ComputationalResources.CPU1{ImageFiltering.Algorithm.IIR}, ::OffsetArray{Gray{Float64},2,Array{Gray{Float64},2}}, ::OffsetArray{Gray{Float64},2,Array{Gray{Float64},2}}, ::Tuple{ImageFiltering.KernelFactors.TriggsSdika{Float64,3,3,9},ImageFiltering.KernelFactors.TriggsSdika{Float64,3,3,9}}, ::Fill{Gray{Float64},0}) at /home/zygmunt/.julia/packages/ImageFiltering/bMda8/src/imfilter.jl:1226
 [7] imfilter_na_separable! at /home/zygmunt/.julia/packages/ImageFiltering/bMda8/src/imfilter.jl:1448 [inlined]
 [8] _imfilter_na!(::ComputationalResources.CPU1{ImageFiltering.Algorithm.IIR}, ::OffsetArray{Gray{Float64},2,Array{Gray{Float64},2}}, ::OffsetArray{Gray{Float64},2,Array{Gray{Float64},2}}, ::Tuple{ImageFiltering.KernelFactors.TriggsSdika{Float64,3,3,9},ImageFiltering.KernelFactors.TriggsSdika{Float64,3,3,9}}, ::NA{0}) at /home/zygmunt/.julia/packages/ImageFiltering/bMda8/src/imfilter.jl:676
 [9] imfilter! at /home/zygmunt/.julia/packages/ImageFiltering/bMda8/src/imfilter.jl:663 [inlined]
 [10] imfilter!(::OffsetArray{Gray{Float64},2,Array{Gray{Float64},2}}, ::OffsetArray{Gray{Float64},2,Array{Gray{Float64},2}}, ::Tuple{ImageFiltering.KernelFactors.TriggsSdika{Float64,3,3,9},ImageFiltering.KernelFactors.TriggsSdika{Float64,3,3,9}}, ::NA{0}, ::ImageFiltering.Algorithm.IIR) at /home/zygmunt/.julia/packages/ImageFiltering/bMda8/src/imfilter.jl:612
 [11] imfilter at /home/zygmunt/.julia/packages/ImageFiltering/bMda8/src/imfilter.jl:606 [inlined]
 [12] imfilter(::OffsetArray{Gray{Float64},2,Array{Gray{Float64},2}}, ::Tuple{ImageFiltering.KernelFactors.TriggsSdika{Float64,3,3,9},ImageFiltering.KernelFactors.TriggsSdika{Float64,3,3,9}}, ::NA{0}) at /home/zygmunt/.julia/packages/ImageFiltering/bMda8/src/imfilter.jl:5
 [13] top-level scope at none:0
zygmuntszpak commented 5 years ago

I believe I have a fix for this, but I still need to add more tests before I make a pull request.