Skip to content

v2.0.0

Latest
Compare
Choose a tag to compare
@github-actions github-actions released this 07 Feb 10:40
· 17 commits to master since this release

LocalFilters v2.0.0

This is a major release.

Version 2 of LocalFilters better integrates in the Julia ecosystem as fewer
custom types are introduced:

  • To represent hyper-rectangular Cartesian sliding windows, former type
    RectangularBox has been replaced by CartesianIndices.

  • Kernels with values or neighborhoods with more complex shape than
    hyper-rectangular Cartesian sliding windows are all represented by abstract
    arrays (with boolean entries to define a neighborhood). The former type
    LocalFilters.Kernel is no longer provided. To account for offsets in the
    indexing, it is recommended to use the
    OffsetArrays package. The
    method LocalFilters.centered(B) can be called to yield a kernel or a
    neighborhood whose index ranges are approximately centered. This method is
    not exported to avoid conflicts (for instance, it has a slightly different
    semantic in OffsetArrays).

Version 2 of LocalFilters provides more general, more consistent, and better
optimized methods:

  • Most filtering operations take an optional ordering argument ord right
    before the argument, say B, specifying the kernel or the neighborhood. If
    ord is ForwardFilter, B is indexed as in discrete correlations;
    otherwise, if ord is ReverseFilter, B is indexed as in discrete
    convolutions. The default ordering is ForwardFilter as this is the most
    natural for many filters (except discrete convolutions of course) and as it
    yields faster code. For symmetric kernels and neighborhoods, the ordering has
    no incidence on the result. In LocalFilters version 1, indexing as in
    discrete convolutions was the only rule.

  • The API of localfilters! have changed a bit, the syntax is
    localfilters!(dst,A,ord=ForwardFilter,B,initial,update,final=identity) with
    dst the destination, A the source, ord the direction of the filter, B
    the kernel or neighborhood of the filter, initial the value of the initial
    state variable, update a method to update the state variable, and final a
    method to yield the result to store in the destination dst given the value
    of the state variable at the end of visiting the neighborhood.

  • Constructor LocalFilters.Indices and helper method
    LocalFilters.localindices may be used as an alternative to localfilters!
    to build custom filters.

  • In all filters, a simple neighborhood that is a hyper-rectangular Cartesian
    sliding window can be specified in many different ways. Such a neighborhood
    is represented by an instance of CartesianIndices with unit step ranges.
    Method LocalFilters.kernel(Dims{N},args...) can be called to build such a
    N-dimensional neighborhood from argument(s) args....

  • Non-exported LocalFilters.ball method is now type stable. Call
    LocalFilters.ball(Dims{N},r) instead of LocalFilters.ball(N,r).

  • The strel method uses uniform arrays from package
    StructuredArrays to
    represent structuring elements with the same value for all valid indices.

  • In out-of-place filters, the destination array needs not be of the same size
    as the source array. The local filtering operation is applied for all indices
    of the destination, using boundary conditions to extract the corresponding
    value in the source array. Currently only flat boundary conditions are
    implemented but this may change in the future.

Guidelines for porting code from version 1 to version 2

If the high level API was used, there should be almost no changes, except for
non-symmetric kernels or neighborhoods for which ReverseFilter ordering must
be specified to mimic the former behavior.

At a lower level, the following changes should be done:

  • Non-exported union LocalFilters.IndexInterval has been replaced by
    LocalFilters.Axis to represent the type of any argument that can be used to
    define a sliding window axis: an integer length or an integer-valued index
    range.

  • Non-exported method LocalFilters.ismmbox has been replaced by
    LocalFilters.is_morpho_math_box.

  • Non-exported method LocalFilters.cartesian_region has been replaced by the
    more general and better designed exported method kernel.

  • Replace Neighborhood{N}(args...) by kernel(Dims{N}, args...) and
    Neighborhood{N} or RectangularBox{N} by LocalFilters.Box{N}.

  • Replace LocalFilters.Kernel by OffsetArrays.OffsetArray.

  • Update the arguments of localfilters!: initial is no longer a method but
    the initial state value, update has the same semantics, and final just
    yields the result of the local filter given the last state value. By default,
    final is identity.

  • Replace LocalFilters.ball(N,r) by LocalFilters.ball(Dims{N},r) which is
    type-stable.