#morphology #dilate #erode #morph

fast_morphology

Fast morphological operations for images

7 releases

0.2.1 Oct 7, 2024
0.2.0 Oct 5, 2024
0.1.4 Sep 30, 2024

#243 in Images

46 downloads per month

BSD-3-Clause OR Apache-2.0

390KB
7K SLoC

Fast morphology in pure Rust

This crate provides fast 2D arbitrary shaped structuring element for planar, RGB and RGBA images. Library provides high performance erosion, dilation, closing, opening, tophat, gradient and blackhat.

In most cases performance when implemented fully in hardware faster than OpenCV.

If you are not familiar read the OpenCV doc

Example

morphology_rgb(
    &src,
    &mut dst,
    MorphExOp::TopHat,
    ImageSize::new(500, 500),
    &structuring_element,
    KernelShape::new(15, 15),
    BorderMode::Clamp,
    MorphologyThreadingPolicy::default(),
).unwrap();

Usage with image crate

let img = ImageReader::open("./assets/fruits.jpg")
          .unwrap()
          .decode()
          .unwrap();
let new_image = morphology_image(
    img,
    MorphExOp::Dilate,
    &structuring_element,
    KernelShape::new(se_size, se_size),
    BorderMode::default(),
    MorphologyThreadingPolicy::default(),
)
.unwrap();
new_image.save("dilated.jpg").unwrap();

Results

Here is some example bokeh effect

And erosion

Benchmarking

If you wish to run benchmarks then

cargo bench --manifest-path ./app/Cargo.toml

FM is shorthand for fast-morphology

M3 Pro, NEON dilation RGB image 2731x4096 with specified kernel size

SE 9x9 15x15 21x21 41x41 61x61
FM 16.81ms 17.99ms 24.53ms 69.00ms 142.76ms
OpenCV 20.65ms 54.43ms 107.58ms 418.66ms 905.21ms

M3 Pro, NEON dilation RGBA image 2731x4096 with specified kernel size

SE 9x9 15x15 21x21 41x41 61x61
FM 21.35ms 27.20ms 36.31ms 93.81ms 191.31ms
OpenCV 30.22ms 72.63ms 138.69ms 555.51ms 1.19s

x86 SSE/AVX dilation RGB image 2731x4096 with specified kernel size

SE 9x9 15x15 21x21 41x41 61x61
FM 30.71ms 34.87ms 39.93ms 81.56ms 149.37ms
OpenCV 27.36ms 63.05ms 112.54ms 419.40ms 1.08s

x86 SSE/AVX dilation RGBA image 2731x4096 with specified kernel size

SE 9x9 15x15 21x21 41x41 61x61
FM 45.03ms 49.03ms 56.40ms 114.72ms 206.05ms
OpenCV 35.50ms 79.60ms 147.32ms 556.56ms 1.33s

This project is licensed under either of

  • BSD-3-Clause License (see LICENSE)
  • Apache License, Version 2.0 (see LICENSE)

at your option.

Dependencies

~1.2–1.7MB
~34K SLoC