use crate::dynmatrix::DynMatrix;
use crate::traits::{FloatScalar, MatrixRef};
pub fn integral_image<T: FloatScalar>(src: &DynMatrix<T>) -> DynMatrix<T> {
let h = src.nrows();
let w = src.ncols();
let mut sat = DynMatrix::<T>::zeros(h + 1, w + 1);
for i in 0..h {
let mut row_sum = T::zero();
for j in 0..w {
row_sum = row_sum + *src.get(i, j);
let above = sat[(i, j + 1)];
sat[(i + 1, j + 1)] = above + row_sum;
}
}
sat
}
#[inline]
pub fn integral_rect_sum<T: FloatScalar>(
sat: &DynMatrix<T>,
r0: usize,
c0: usize,
r1: usize,
c1: usize,
) -> T {
debug_assert!(r0 <= r1 && c0 <= c1, "rectangle bounds must be ordered");
let nrows = sat.nrows().saturating_sub(1);
let ncols = sat.ncols().saturating_sub(1);
let r0 = r0.min(nrows);
let c0 = c0.min(ncols);
let r1 = r1.min(nrows);
let c1 = c1.min(ncols);
sat[(r1, c1)] + sat[(r0, c0)] - sat[(r1, c0)] - sat[(r0, c1)]
}