2个不稳定版本
0.2.0 | 2024年7月15日 |
---|---|
0.1.0 | 2021年12月9日 |
#268 in 算法
45KB
524 行
convolve2d
:Rust中的图像卷积
这个crate定义了一种简单和可扩展的方式来执行图像卷积,不依赖于系统,且支持no_std
。听起来很酷?继续阅读!
convolve2d
的目的是提供一个包含所有执行图像卷积所需内容的单一包,这些卷积适用于计算机视觉或图像处理。以下是一些简要概述:
-
两个卷积函数:允许您在速度重要时传递自己的缓冲区,或者分配并返回一个缓冲区,以实现更符合习惯的接口。
-
特质:卷积在
Matrix
特质中定义为泛型。如果您有一个自定义图像类型,只需定义一个Matrix
的实现即可! -
内置的
image
支持:我们还通过功能标志(默认禁用)提供对image
库的支持,允许您无缝地使用您已经熟悉的类型! -
rayon
:使用rayon
标志并行计算卷积。(默认启用) -
no_std
操作:以满足特殊系统或WASM的需求。 -
内核生成器:
kernel
模块提供了用于图像处理中常用内核的生成函数。
尽管其他卷积库可能更高效,使用更快的算法或运行在GPU上,但这个库的主要重点是提供一个完整、易于使用的卷积体验。
示例
以下示例展示了使用image
库的扩展如何轻松地进行卷积。(请参阅image
功能)
use image::RgbImage;
use convolve2d::*;
// Simply use `into` to convert from an `ImageBuffer` to a `DynamicMatrix`.
let image_buffer: RgbImage = ...;
let img: DynamicMatrix<SubPixels<u8, 3>> = image_buffer.into();
// Convert our color space to floating point, since our gaussian will be `f64`s
let img: DynamicMatrix<SubPixels<f64, 3>> = img.map_subpixels(|sp| sp as f64 / 255.0);
// Generate a 5x5 gaussian with standard deviation 2.0
let kernel = kernel::gaussian(5, 2.0);
// Perform the convolution, getting back a new `DynamicMatrix`
let convolution = convolve2d(&img, &kernel);
// Convert the color space back to 8-bit colors
let convolution = convolution.map_subpixels(|sp| f64::round(sp * 255.0) as u8);
// Convert back into an `RgbImage` and save using the `image` library
RgbImage::from(convolution).save("output.png").expect("Unable to save image");
功能
以下功能得到支持
功能 | 默认 | 描述 |
---|---|---|
std |
是 | 允许访问标准库,启用DynamicMatrix 类型。 |
rayon |
是 | 使用rayon并行计算卷积。 |
image |
否 | 添加与image crate互操作的扩展。 |
full |
否 | 所有功能。 |
要使用no_std
模式下的库,只需禁用所有功能
convolve2d = { version = "0.1.0", default-features = false }
有关image
兼容性的说明
通过使用image
功能标志提供对image
库的兼容性。此标志提供了以下功能
- 各种像素格式(如
Rgb
、Luma
等)现在可以转换为和从SubPixels
类型。这使得它们可以按需缩放并添加到卷积中。 - 可以使用
into
和from
将ImageBuffer
转换为和从DynamicMatrix
。 - 像素类型为
Luma
的ImageBuffer
可以直接用作Matrix
。这是因为底层数据结构中的每个元素都是单个像素。(而在RGB图像中,每个元素是一个子像素,这意味着我们需要使用SubPixels
进行分组)
致谢
感谢以下包!
库 | 所有者 / 维护者 | 许可 |
---|---|---|
image |
HeroicKatora, fintelia | MIT |
rayon |
Josh Stone, Niko Matsakis | Apache 2.0或MIT |
clap |
Kevin K & 维护者 | Apache 2.0或MIT |
test-case |
Wojciech Polak, Luke Biel | MIT |
以及整个Rust社区!
贡献
文档中有什么不清楚的吗?我们需要另一种内核类型吗?这个库是一个个人项目,但欢迎在GitLab上提交问题或PR!
许可
此库根据MIT许可协议发布。
版权(C)2021 Joseph Skubal
依赖
~1.1–1.6MB
~31K SLoC