skubalj / convolve2d

Easy and extensible pure Rust image convolutions. https://crates.io/crates/convolve2d
MIT License
0 stars 0 forks source link

convolve2d: Image Convolutions in Rust

This crate defines an easy and extensible way to conduct image convolutions, in a way that is free of system dependencies, and works with no_std. Sound cool? Read on!

The purpose of convolve2d is to provide a single package that provides everything you need to conduct image convolutions suitable for computer vision or image manipulation. Here's a breif overview of what's on offer:

While other convolution libraries may be more efficient, using a faster algorithm, or running on the GPU, this library's main focus is providing a complete convolution experience that is portable and easy to use.

Example:

This example shows how easy it is to perform convolutions when using the extensions for the image library. (See the image feature)

use image::RgbImage;
use convolve2d::*;

// Simply use `into` to convert from an `ImageBuffer` to a `DynamicMatrix`.
let image_buffer: RgbImage = ...;
let img: DynamicMatrix<SubPixels<u8, 3>> = image_buffer.into();

// Convert our color space to floating point, since our gaussian will be `f64`s
let img: DynamicMatrix<SubPixels<f64, 3>> = img.map_subpixels(|sp| sp as f64 / 255.0);

// Generate a 5x5 gaussian with standard deviation 2.0
let kernel = kernel::gaussian(5, 2.0);

// Perform the convolution, getting back a new `DynamicMatrix`
let convolution = convolve2d(&img, &kernel);

// Convert the color space back to 8-bit colors 
let convolution = convolution.map_subpixels(|sp| f64::round(sp * 255.0) as u8);

// Convert back into an `RgbImage` and save using the `image` library
RgbImage::from(convolution).save("output.png").expect("Unable to save image");

Features:

The following features are supported:

Feature Default Description
std Yes Allow access to the standard library, enabling the DynamicMatrix type.
rayon Yes Use rayon to compute convolutions in parallel.
image No Add extensions for interoperation with the image crate.
full No All features.

To use the library in no_std mode, simply disable all features:

convolve2d = { version = "0.1.0", default-features = false }

Notes on image Compatibility

Compatibility with the image library is provided using the image feature flag. This flag provides the following features:

Acknowledgment:

Thanks to the following packages! Crate Owner / Maintainer License
image HeroicKatora, fintelia MIT
rayon Josh Stone, Niko Matsakis Apache 2.0 or MIT
clap Kevin K & Maintainers Apache 2.0 or MIT
test-case Wojciech Polak, Luke Biel MIT

And to the Rust community at large!

Contributions:

Is something not clear in the documentation? Do we need another kernel type? This library came about as a personal project, but feel free to submit issues or PRs on GitLab!

License:

This crate is released under the terms of the MIT License.

Copyright (C) 2021 Joseph Skubal