use alloc::vec::Vec;
use crate::dynmatrix::DynMatrix;
use crate::traits::FloatScalar;
use super::border::BorderMode;
use super::filters::gaussian_blur;
use super::resize::resize_bilinear;
pub fn difference_of_gaussians<T: FloatScalar>(
src: &DynMatrix<T>,
sigma_small: T,
sigma_large: T,
border: BorderMode<T>,
) -> DynMatrix<T> {
let a = gaussian_blur(src, sigma_small, border);
let b = gaussian_blur(src, sigma_large, border);
let h = src.nrows();
let w = src.ncols();
let mut out = DynMatrix::<T>::zeros(h, w);
for j in 0..w {
for i in 0..h {
out[(i, j)] = a[(i, j)] - b[(i, j)];
}
}
out
}
pub fn gaussian_pyramid<T: FloatScalar>(
src: &DynMatrix<T>,
levels: usize,
sigma: T,
border: BorderMode<T>,
) -> Vec<DynMatrix<T>> {
let mut out = Vec::with_capacity(levels);
if levels == 0 {
return out;
}
out.push(src.clone());
for _ in 1..levels {
let prev = out.last().unwrap();
if prev.nrows() <= 1 || prev.ncols() <= 1 {
break;
}
let blurred = gaussian_blur(prev, sigma, border);
let down = resize_bilinear(&blurred, prev.nrows() / 2, prev.ncols() / 2);
out.push(down);
}
out
}