diff --git a/src/kernel.rs b/src/kernel.rs index 396fa5e..3284673 100644 --- a/src/kernel.rs +++ b/src/kernel.rs @@ -7,6 +7,32 @@ pub trait Kernel { fn convolve
(&self, img: &image::Image
) -> image::Image
where P: image::Pixel; + + fn convolve_sat
(&self, img: &image::Image
) -> image::Image
+ where + P: image::Pixel; +} + +fn at_sat
(x: isize, y: isize, img: &image::Image
) -> P
+where
+ P: Copy,
+{
+ img.at(
+ if x < 0 {
+ 0
+ } else if x as usize >= img.extent.x {
+ img.extent.x - 1
+ } else {
+ x as usize
+ },
+ if y < 0 {
+ 0
+ } else if y as usize >= img.extent.y {
+ img.extent.y - 1
+ } else {
+ y as usize
+ },
+ )
}
impl (&self, img: &image::Image ) -> image::Image
+ where
+ P: image::Pixel,
+ {
+ let l = N as isize / 2;
+ let mut result = image::Image::with_extent(img.extent);
+ result.for_each(|x, y, p| {
+ for i in 0..N {
+ for j in 0..N {
+ let xi = (x + j) as isize - l;
+ let yi = (y + i) as isize - l;
+ *p += at_sat(xi, yi, img) * self[i][j];
+ }
+ }
+ });
+ result
+ }
}
#[cfg(test)]