graph-based-image-segmentation 0.2.1

An implementation of graph-based image segmentation algorithms based on superpixels.
Documentation
use criterion::{criterion_group, criterion_main, Criterion};
use graph_based_image_segmentation::{EuclideanRGB, NodeMergingThreshold, Segmentation};
use opencv::{
    core::{Size, BORDER_DEFAULT},
    imgcodecs::{imdecode, IMREAD_COLOR},
    imgproc::gaussian_blur,
    prelude::*,
};
use std::time::Duration;

fn criterion_benchmark(c: &mut Criterion) {
    let sigma = 0.8f64;
    let kernel_size = 5;
    let threshold = 10f32;
    let segment_size = 10;

    let tree = Mat::from_slice(include_bytes!("../../data/tree.jpg")).unwrap();
    let mut image = imdecode(&tree, IMREAD_COLOR).unwrap();
    image = blur_image(&mut image, sigma, kernel_size).unwrap();

    let mut group = c.benchmark_group("segmentation");
    group.measurement_time(Duration::from_secs(15));

    group.bench_function("segment_image 0.8 10", |b| {
        b.iter(|| {
            let mut segmenter = Segmentation::new(
                EuclideanRGB::default(),
                NodeMergingThreshold::new(threshold),
                segment_size,
            );
            segmenter.segment_image(&image);
        })
    });

    group.finish();
}

fn blur_image(image: &Mat, sigma: f64, size: usize) -> opencv::Result<Mat> {
    let mut blurred = Mat::default();
    gaussian_blur(
        &image,
        &mut blurred,
        Size::new(size as i32, size as i32),
        sigma,
        sigma,
        BORDER_DEFAULT,
    )?;
    Ok(blurred)
}

criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);