#恢复 #实现 #求解器 #图像 #图像去噪

nightly image-recovery

使用Rust实现的图像恢复算法

4个版本 (2个重大更改)

0.3.1 2023年8月7日
0.3.0 2023年8月7日
0.2.10 2023年8月7日
0.1.0 2022年4月18日

#722 in 数学

每月22次下载

AGPL-3.0-or-later

785KB
639

图像恢复

使用Rust实现的图像恢复算法。

本库中的求解器基于Chambolle, A. and Pock, T. (2011)中提出的算法,并受到Bredies, K. (2014)的启发进行了修改。

使用image crate加载和保存图像,使用ndarray crate操作矩阵。

目前只实现了去噪算法,有关计划实现的算法,请参阅路线图部分

Crates.io GitHub Workflow Status (with event) GitHub

查看文档

如何使用

在Cargo.toml中声明依赖项

[dependencies]
image-recovery = "0.2"

示例

目前只实现了denoise求解器。它的示例可以在examples文件夹中找到,可以通过cargo run --example denoise运行。下面是一个快速示例用法:

图像去噪(多通道)

use image_recovery::{
    image, // re-exported `image` crate
    ImageArray, // struct for holding images
};

fn main() {
    // the `image` crate provides functionality to decode images
    let img = image::open("examples/source_images/angry_birb_noisy.png")
        .expect("image could not be open")
        .into_rgb8(); // the algorithms in this library are implemented for the Luma and Rgb types

    // load the RGB image into an object which is composed
    // of 3 matrices, one for each channel
    let img_array = ImageArray::from(&img);

    // choose inputs for the denoising solver:
    // according to Chambolle, A. and Pock, T. (2011),
    // tau and lambda should be chosen such that
    // `tau * lambda * L2 norm^2 <= 1`
    // while `L2 norm^2 <= 8`
    // If we choose `tau * lambda * L2 norm^2 == 1`, then:
    let tau: f64 = 1.0 / 2_f64.sqrt();
    let sigma: f64 = 1_f64 / (8.0 * tau);

    // lambda drives the dual objective function
    // closer to zero results in a smoother output image
    // closer to infinity results in an output closer to the input
    let lambda: f64 = 0.0259624705;

    // gamma is a variable used to update the internal
    // state of the algorithm's variables, providing
    // an accelerated method for convergence.
    // Chambolle, A. and Pock, T. (2011), choose
    // the value to be `0.35 * lambda`
    let gamma: f64 = 0.35 * lambda;

    // choose bounds for denoising solver
    // the algorithm will run for at most `max_iter` iterations
    let max_iter: u32 = 500;

    // the algorithm will stop running if:
    // `convergence_threshold < norm(current - previous) / norm(previous)`
    // where `current` is the output candidate for the current iteration,
    // and `previous` is the output candidate of the previous iteration.
    let convergence_threshold = 10_f64.powi(-10);

    // now we can call the denoising solver with the chosen variables
    let denoised_array = image_array
        .denoise(lambda, tau, sigma, gamma, max_iter, convergence_threshold)
        .unwrap(); // will fail if image is 1 pixel in either x or y

    // we convert the solution into an RGB image format
    let denoised_img = denoised_array.into_rgb();

    // encode it and save it to a file
    new_img.save("examples/result_images/angry_birb_denoised.png")
        .expect("image could not be saved");
}

这应该会提供以下结果

源图像 输出图像
source image, noisy output image, denoised

测试

可以使用cargo test运行测试。提供了单元测试和文档测试。

请注意,在src/lib.rs中的文档测试在调试模式下会运行得非常慢,建议以发布模式运行测试:cargo test --release

基准测试

可以使用cargo bench运行基准测试。

路线图

要实现的图像恢复算法

  • 去噪
  • 缩放
  • 去模糊
  • 去量化
  • 修复
  • 压缩成像

此代码根据GNU Affero通用公共许可证版本3或更高版本授权。请参阅LICENSEgnu.org/licenses/agpl-3.0.en.html

致谢

代码由Lílian Ferreira de Freitas编写,数学由Emilia L. K. Blåsten提供。

依赖关系

~15MB
~92K SLoC