#blur #convolution #computer-vision

bokeh

Bokeh是一个基于Rust实现的图像模糊库,专注于使用圆形核来产生类似散景镜头的效果。

1个不稳定版本

0.1.0 2023年1月27日

#865图像

MIT 许可证

320KB
618

Bokeh

使用圆形核实现图像模糊的Rust库,以产生类似“Bokeh”镜头的效果。

在Mike Pound的这里的工作基础上进行了大量借鉴。

圆形核通过复数高斯核的和进行近似。由于高斯模糊是可分离的,因此在卷积期间不需要应用单个二维核,而是可以在每个轴上应用一维核。为了形成散景模糊效果,使用了圆形核。该核通过累加多个复数高斯核来创建,组件的数量越多,近似的质量就越好。这些组件的相对权重通过尝试最小化与完美形状核的偏差来找到。更多内容请参阅这里这里

要查看不同组件数量和不同核半径的核的形状,请参阅这里。从图中可以看出,在4/5个组件之后,使用更多的组件带来的收益非常有限。每个额外使用的组件都会增加对图像执行的卷积次数,即使用8个组件的速度是使用4个组件的两倍。

目前只支持具有4个通道的图像。

提供了独立的API,允许传递掩码。此掩码允许保留原始图像的像素。这应该是一个bool的迭代器,其中true对应于卷积图像,而false对应于原始图像。

示例

使用image库(需要默认的image功能)

use bokeh::{params::KERNEL9_PARAM_SET, Blur};
use image::{io::Reader as ImageReader, ImageError};

// read the image
let mut img = ImageReader::open("myimage.jpg")?.decode()?;
// as the `bokeh::Blur` trait is imported
img.bokeh_blur(1.0, &KERNEL9_PARAM_SET, 3.0);
// save the image
img.save("output.png")?;

直接使用函数

use bokeh::{bokeh_blur, params::KERNEL9_PARAM_SET};

// create simple 'image'
let mut pixels = vec![[0., 0., 0., 0.]; 9];
pixels[4] = [255., 255., 255., 255.];

// blur the image using 9 components
bokeh_blur(&mut pixels, 3, 3, 1.0, &KERNEL9_PARAM_SET, 3.0);

// pixels now blurred
assert_eq!(
    vec![
        1.6428886692061846,
        14.80242203513296,
        1.6428886692061846,
        14.802422035132915,
        254.93338630375473,
        14.802422035132915,
        1.6428886692061846,
        14.80242203513296,
        1.6428886692061846
    ]
    .iter()
    .map(|&i| [i, i, i, i])
    .collect::<Vec<_>>(),
    pixels
);

还提供了一个实用结构体Image

use bokeh::{Blur, Image, params::KERNEL9_PARAM_SET};

let mut pixels = vec![[0., 0., 0., 0.]; 9];
pixels[4] = [255., 255., 255., 255.];
// same as above but using the struct
let mut img = Image::new(&mut pixels, 3, 3);

img.bokeh_blur(1.0, &KERNEL9_PARAM_SET, 3.0);

assert_eq!(
    vec![
        1.6428886692061846,
        14.80242203513296,
        1.6428886692061846,
        14.802422035132915,
        254.93338630375473,
        14.802422035132915,
        1.6428886692061846,
        14.80242203513296,
        1.6428886692061846
    ]
    .iter()
    .map(|&i| [i, i, i, i])
    .collect::<Vec<_>>(),
    img.pixels
);

提供掩码

use bokeh::{Blur, Image, params::KERNEL9_PARAM_SET};

let mut pixels = vec![[0., 0., 0., 0.]; 9];
pixels[4] = [255., 255., 255., 255.];
// creating a mask
let mask = vec![false, true, false, true, false, true, false, true, false];
let mut img = Image::new(&mut pixels, 3, 3);

img.bokeh_blur_with_mask(&mask, 1.0, &KERNEL9_PARAM_SET, 3.0);

assert_eq!(
    vec![
        0.,
        14.80242203513296,
        0.,
        14.802422035132915,
        255.,
        14.802422035132915,
        0.,
        14.80242203513296,
        0.
    ]
    .iter()
    .map(|&i| [i, i, i, i])
    .collect::<Vec<_>>(),
    img.pixels
);

在上面的assert!语句中,与上一个示例进行比较,可以看到保留了原始像素值。

许可证:MIT

依赖关系

~15MB
~92K SLoC