2 releases

0.1.1 Feb 3, 2024
0.1.0 Feb 3, 2024

#647 in Math

Download history 23/week @ 2024-02-12 35/week @ 2024-02-19 16/week @ 2024-02-26 9/week @ 2024-03-04 34/week @ 2024-03-11 4/week @ 2024-03-25 43/week @ 2024-04-01 865/week @ 2024-04-08 330/week @ 2024-04-15

1,242 downloads per month

MIT license

4MB
134 lines

Rust crates.io docs.rs

butter2d

butter

Pure Rust Implementation of the Butterworth Filter

This crate provides a pure Rust implementation of the Butterworth filter, designed for high-performance spatial frequency filtering of images. It is inspired by and seeks to replicate the functionality of the Butterworth filter as implemented in the popular Python library, scikit-image.

Overview

The Butterworth filter offers a more robust method for applying spatial frequency filters to images compared to traditional FFT/IFFT-based methods. Filters with sharp cutoffs can often lead to the Gibbs phenomenon, where undesirable ringing artifacts appear near edges in the image. This issue is particularly problematic in applications such as EEG signal processing and other scenarios involving low-frequency signals. By providing a smoother transition between the passband and stopband, the Butterworth filter mitigates these effects, making it a preferred choice among vision scientists and image processing experts.

Features

  • Pure Rust implementation for optimal performance and integration with Rust-based image processing pipelines.
  • Support for both high-pass and low-pass filtering, with customizable cutoff frequency and filter order parameters.
  • Detailed examples and documentation to help users quickly integrate the filter into their projects.

Comparisons: Rust vs Python with Same Input Values

To visually demonstrate the effectiveness and similarity of our Rust implementation compared to the Python (scikit-image) version, here are comparison images. These comparisons help illustrate both the visual and frequency spectrum outcomes using identical input values across both implementations.

Visual Comparison

Visual Comparison

Spectrum Comparison

Spectrum Comparison

Usage

Here's a quick example of applying a high-pass Butterworth filter to an image:

cargo add butter2d
use image::{GrayImage, open};
use butter2d::butterworth;

fn main() {
    let img = open("path/to/your/image.png").expect("Failed to open image").to_luma8();
    let cutoff_frequency_ratio = 0.1;
    let high_pass = true;
    let order = 2.0;
    let squared_butterworth = false;
    let npad = 0;
    let filtered_img = butterworth(
        &img, 
        cutoff_frequency_ratio, 
        high_pass, 
        order, 
        squared_butterworth, 
        npad
    );
    filtered_img.save("path/to/save/filtered_image.png").expect("Failed to save filtered image");
}

Dependencies

~24MB
~279K SLoC