subpixel-edge 0.2.0

High-performance subpixel edge detection library with parallel processing using Canny algorithm
use std::time::Instant;

#[cfg(feature = "logger")]
use env_logger::Builder;
#[cfg(feature = "logger")]
use log::info;

#[cfg(feature = "imagers")]
use image::{imageops::blur, open};

#[cfg(feature = "opencv")]
use opencv::{core::Mat, imgcodecs, imgproc, prelude::*};

use subpixel_edge::{canny_based_subpixel_edges_optimized, visualize_edges};

#[cfg(feature = "imagers")]
fn main() {
    #[cfg(feature = "logger")]
    Builder::from_default_env().format_timestamp_nanos().init();

    // 加载图像
    let img = open("test_image/edge-small.png").unwrap().to_luma8();

    let blur = blur(&img, 1.0);

    #[cfg(feature = "logger")]
    info!("start cal");

    let instance = Instant::now();

    // 亚像素边缘检测
    let edges = canny_based_subpixel_edges_optimized(&blur, 20.0, 80.0, 0.6);

    let elapsed = instance.elapsed();

    #[cfg(feature = "logger")]
    info!("检测耗时: {elapsed:?}");

    // 可视化结果
    let result = visualize_edges(&img, &edges);
    result.save("test_image/subpixel_edges.png").unwrap();

    #[cfg(feature = "logger")]
    info!("检测到 {} 个亚像素边缘点", edges.len());

    #[cfg(not(feature = "logger"))]
    println!("检测到 {} 个亚像素边缘点,耗时: {:?}", edges.len(), elapsed);
}

#[cfg(feature = "opencv")]
fn main() {
    #[cfg(feature = "logger")]
    Builder::from_default_env().format_timestamp_nanos().init();

    // 加载图像
    let img = imgcodecs::imread("test_image/edge-small.png", imgcodecs::IMREAD_GRAYSCALE).unwrap();

    // 应用高斯模糊
    let mut blurred = Mat::default();
    let ksize = opencv::core::Size::new(7, 7);
    imgproc::gaussian_blur(
        &img,
        &mut blurred,
        ksize,
        3.0,
        3.0,
        opencv::core::BORDER_DEFAULT,
    )
    .unwrap();

    #[cfg(feature = "logger")]
    info!("start cal");

    let instance = Instant::now();

    // 亚像素边缘检测
    let edges = canny_based_subpixel_edges_optimized(&blurred, 20.0, 80.0, 0.6);

    let elapsed = instance.elapsed();

    #[cfg(feature = "logger")]
    info!("检测耗时: {elapsed:?}");

    // 可视化结果
    let result = visualize_edges(&img, &edges);
    imgcodecs::imwrite(
        "test_image/subpixel_edges.png",
        &result,
        &opencv::core::Vector::new(),
    )
    .unwrap();

    #[cfg(feature = "logger")]
    info!("检测到 {} 个亚像素边缘点", edges.len());

    #[cfg(not(feature = "logger"))]
    println!("检测到 {} 个亚像素边缘点,耗时: {:?}", edges.len(), elapsed);
}

#[cfg(not(any(feature = "imagers", feature = "opencv")))]
fn main() {
    eprintln!("Error: You must enable either 'imagers' or 'opencv' feature to run this example.");
    eprintln!("Try running with:");
    eprintln!("  cargo run --example subpixel_edge_detection --features imagers,logger");
    eprintln!("  or");
    eprintln!("  cargo run --example subpixel_edge_detection --features opencv,logger");
}