1个不稳定版本
0.1.0 | 2023年1月27日 |
---|
#865 在 图像
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