#图像处理 #卷积 #图像 #计算机视觉 #convolve

无std convolve2d

简单易扩展的纯Rust图像卷积

2个不稳定版本

0.2.0 2024年7月15日
0.1.0 2021年12月9日

#268 in 算法

MIT许可证

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 添加与imagecrate互操作的扩展。
full 所有功能。

要使用no_std模式下的库,只需禁用所有功能

convolve2d = { version = "0.1.0", default-features = false }

有关image兼容性的说明

通过使用image功能标志提供对image库的兼容性。此标志提供了以下功能

  • 各种像素格式(如RgbLuma等)现在可以转换为和从SubPixels类型。这使得它们可以按需缩放并添加到卷积中。
  • 可以使用intofromImageBuffer转换为和从DynamicMatrix
  • 像素类型为LumaImageBuffer可以直接用作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