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次下载
785KB
639 行
图像恢复
使用Rust实现的图像恢复算法。
本库中的求解器基于Chambolle, A. and Pock, T. (2011)中提出的算法,并受到Bredies, K. (2014)的启发进行了修改。
使用image
crate加载和保存图像,使用ndarray
crate操作矩阵。
目前只实现了去噪算法,有关计划实现的算法,请参阅路线图部分。
如何使用
在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");
}
这应该会提供以下结果
源图像 | 输出图像 |
---|---|
测试
可以使用cargo test
运行测试。提供了单元测试和文档测试。
请注意,在src/lib.rs
中的文档测试在调试模式下会运行得非常慢,建议以发布模式运行测试:cargo test --release
。
基准测试
可以使用cargo bench
运行基准测试。
路线图
要实现的图像恢复算法
- 去噪
- 缩放
- 去模糊
- 去量化
- 修复
- 压缩成像
版权
此代码根据GNU Affero通用公共许可证版本3或更高版本授权。请参阅LICENSE或gnu.org/licenses/agpl-3.0.en.html。
致谢
代码由Lílian Ferreira de Freitas编写,数学由Emilia L. K. Blåsten提供。
依赖关系
~15MB
~92K SLoC