#小波 #DWT #计算机视觉

omni-wave

易于使用的DWT(离散小波变换)库,无需担心填充,并提供多种小波。

2个不稳定版本

0.2.1 2023年6月2日
0.1.0 2023年5月30日

762数学

每月下载 22

MIT/Apache

40KB
579

omni-wave

易于使用的DWT(离散小波变换)库,无需担心填充,并提供多种小波。

注意:我的知识无法保证其“正确性”,但它确实“集中能量”和“完美重建”。

use approx::assert_abs_diff_eq;
use ndarray::{Array1, Array2, Axis};
use omni_wave::*;

let wavelet = wavelet::BIOR_3_1;
let love = Array2::from_shape_vec((8, 8),
vec![0., 0., 0., 0., 0., 0., 0., 0.,
     0., 0.,99., 0., 0.,99., 0., 0.,
     0.,99.,99.,99.,99.,99.,99., 0.,
     0.,99.,99.,99.,99.,99.,99., 0.,
     0.,99.,99.,99.,99.,99.,99., 0.,
     0., 0.,99.,99.,99.,99., 0., 0.,
     0., 0., 0.,99.,99., 0., 0., 0.,
     0., 0., 0., 0., 0., 0., 0., 0.,]).unwrap();

let mut signal = love.clone();
let mut buffer = Array1::zeros(signal.len_of(Axis(0)) + wavelet.window_size() - 2); // The minimum length of a buffer

completely_decompose_2d(signal.view_mut(), buffer.view_mut(), wavelet);
completely_reconstruct_2d(signal.view_mut(), buffer.view_mut(), wavelet);

love.into_iter()
    .zip(signal)
    .for_each(|(a, b)| assert_abs_diff_eq!(a, b, epsilon = 0.0001));

特性

  • f64 - 默认用于计算的原始类型是 f32。启用此功能可切换到 f64

知识

信号

需要转换的数据。 长度应该是偶数。 如果不满足长度要求,则可能不会导致panic,但函数的行为将是未定义的。

输入的左侧将被视为 近似,而右侧将被视为 细节

填充

处理信号时的扩展。我们使用的填充方法名为 periodic(在 PyWavelets),

[ A.B.C.D.E.F.G.H ] a.b.c.d ...
  ↑^^^^^^^^^^^^^^   ↑^^^^^^
  Original signal   Padding: automatically fill & detach.

最初,我计划提供更多扩展模式,但发现小波如 bior2.2 的第一个系数为零... 这样不会丢失信息吗? 所以目前只提供 periodic 模式。如果您有更好的建议,请告诉我。

缓冲区

计算时的临时缓冲区。为了性能,强烈建议其在内存中是连续的。

窗口大小

小波系数的数量。

依赖关系

~1.5MB
~25K SLoC