pub fn grayscale_erode(image: &GrayImage, mask: &Mask) -> GrayImage {
    mask_reduce(image, mask, u8::MAX, u8::min)
}
Computes the morphologic erosion of `image` with the given mask.

For each input pixel, the output pixel will be the minimum of all pixels included
in the mask at that position. If the mask doesn't intersect any input pixel at some point,
it will default to a value of [`u8::MAX`].

# Examples
```
# extern crate image;
# #[macro_use]
# extern crate imageproc;
# fn main() {
use image::GrayImage;
use imageproc::morphology::{Mask, grayscale_erode};

let image = gray_image!(
7,  99,  99,  99,  99, 222;
99,  99,  99,  99,  99, 222;
99,  99,  99,  99, 222, 222;
7,  99,  99,  99, 222, 222;
99,  99,  99, 222, 222, 222
);

// Using a diamond mask
let diamond_eroded = gray_image!(
7,   7,  99,  99,  99,  99;
7,  99,  99,  99,  99,  99;
7,  99,  99,  99,  99, 222;
7,   7,  99,  99,  99, 222;
7,  99,  99,  99, 222, 222
);
assert_pixels_eq!(grayscale_erode(&image, &Mask::diamond(1)), diamond_eroded);

// Using a disk mask
let disk_eroded = gray_image!(
7,   7,   7,   7,  99,  99;
7,   7,   7,  99,  99,  99;
7,   7,   7,  99,  99,  99;
7,   7,   7,   7,  99,  99;
7,   7,   7,  99,  99,  99
);
assert_pixels_eq!(grayscale_erode(&image, &Mask::disk(3)), disk_eroded);

// Using a square mask
let square_eroded = gray_image!(
7,   7,  99,  99,  99,  99;
7,   7,  99,  99,  99,  99;
7,   7,  99,  99,  99,  99;
7,   7,  99,  99,  99, 222;
7,   7,  99,  99,  99, 222
);
assert_pixels_eq!(grayscale_erode(&image, &Mask::square(1)), square_eroded);

// Using an arbitrary mask
let column_mask = Mask::from_image(
&gray_image!(
255;
255;
255;
255
),
0,  1
);
let column_eroded = gray_image!(
7,  99,  99,  99,  99, 222;
7,  99,  99,  99,  99, 222;
7,  99,  99,  99,  99, 222;
7,  99,  99,  99, 222, 222;
7,  99,  99,  99, 222, 222
);
assert_pixels_eq!(grayscale_erode(&image, &column_mask), column_eroded);
# }
```
src/morphology.rs