image_dwt/
layer.rs

1use image::{ImageBuffer, Luma, Rgb};
2use ndarray::{Array2, Array3};
3
4use crate::aggregate::Aggregate;
5
6#[derive(Clone)]
7pub enum WaveletLayerBuffer {
8    Grayscale { data: Array2<f32> },
9    Rgb { data: Array3<f32> },
10}
11
12impl Aggregate for WaveletLayerBuffer {
13    fn min(&self) -> f32 {
14        match self {
15            WaveletLayerBuffer::Grayscale { data } => data.min(),
16            WaveletLayerBuffer::Rgb { data } => data.min(),
17        }
18    }
19
20    fn max(&self) -> f32 {
21        match self {
22            WaveletLayerBuffer::Grayscale { data } => data.max(),
23            WaveletLayerBuffer::Rgb { data } => data.max(),
24        }
25    }
26}
27
28#[derive(Clone)]
29pub enum WaveletLayerImageBuffer {
30    Grayscale {
31        buffer: ImageBuffer<Luma<f32>, Vec<f32>>,
32    },
33    Rgb {
34        buffer: ImageBuffer<Rgb<f32>, Vec<f32>>,
35    },
36}
37
38impl From<WaveletLayerBuffer> for WaveletLayerImageBuffer {
39    fn from(value: WaveletLayerBuffer) -> Self {
40        match value {
41            WaveletLayerBuffer::Grayscale { data } => {
42                let (height, width) = data.dim();
43
44                let mut buffer: ImageBuffer<Luma<f32>, Vec<f32>> =
45                    ImageBuffer::new(width as u32, height as u32);
46
47                for (x, y, pixel) in buffer.enumerate_pixels_mut() {
48                    let intensity = data[(y as usize, x as usize)];
49                    *pixel = Luma([intensity]);
50                }
51
52                WaveletLayerImageBuffer::Grayscale { buffer }
53            }
54            WaveletLayerBuffer::Rgb { data } => {
55                let (height, width, _) = data.dim();
56
57                let mut buffer: ImageBuffer<Rgb<f32>, Vec<f32>> =
58                    ImageBuffer::new(width as u32, height as u32);
59
60                for (x, y, pixel) in buffer.enumerate_pixels_mut() {
61                    let red = data[(y as usize, x as usize, 0)];
62                    let green = data[(y as usize, x as usize, 1)];
63                    let blue = data[(y as usize, x as usize, 2)];
64
65                    *pixel = Rgb([red, green, blue]);
66                }
67
68                WaveletLayerImageBuffer::Rgb { buffer }
69            }
70        }
71    }
72}
73
74#[derive(Clone)]
75pub struct WaveletLayer {
76    pub buffer: WaveletLayerBuffer,
77    pub pixel_scale: Option<usize>,
78}
79
80impl WaveletLayer {
81    pub fn is_residue_layer(&self) -> bool {
82        self.pixel_scale.is_none()
83    }
84}