pub fn grayscale_dilate(image: &GrayImage, mask: &Mask) -> GrayImage {
    mask_reduce(image, mask, u8::MIN, u8::max)
}
Computes the morphologic dilation of `image` with the given mask.

For each input pixel, the output pixel will be the maximum 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::MIN`].

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

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

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

// Using a disk mask
let disk_dilated = gray_image!(
99,  99,  99,  99,  99,   0;
99,  99,  99,  99,  99, 222;
99,  99,  99, 222, 222, 222;
99,  99,  99, 222, 222, 222;
99,  99, 222, 222, 222, 222
);
assert_pixels_eq!(grayscale_dilate(&image, &Mask::disk(3)), disk_dilated);

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

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