#include <stdio.h>
#include <cstdlib>
{
}
{
}
{
}
{
    return (img - morphopen(img, mask));
}
{
    return (morphclose(img, mask) - img);
}
array border(
const array& img, 
const int left, 
const int right,
         const int top, const int bottom,
        const float value = 0.0)
{
    if((
int)img.
dims(0) < (top + bottom))
         std::cerr << "input does not have enough rows" << std::endl;
    if((
int)img.
dims(1) < (left + right))
         std::cerr << "input does not have enough columns" << std::endl;
    ret(
seq(top, imgDims[0]-bottom), 
seq(left, imgDims[1]-right), 
span, 
span) =
        img(
seq(top, imgDims[0]-bottom), 
seq(left, imgDims[1]-right), 
span, 
span);
    return ret;
}
array border(
const array& img, 
const int w, 
const int h,
         const float value = 0.0)
{
    return border(img, w, w, h, h, value);
}
array border(
const array& img, 
const int size, 
const float value = 0.0)
 {
    return border(img, size, size, size, size, value);
}
{
    for(
int i = 0; i < (int)blurred.
dims(2); i++)
     return blurred;
}
static void morphing_demo()
{
    af::Window wnd(1280, 720, 
"Morphological Operations");
     
    array img_rgb = 
loadImage(ASSETS_DIR 
"/examples/images/man.jpg", 
true) / 255.f; 
     array op = morphopen(img_rgb, mask);
     array cl = morphclose(img_rgb, mask);
     array gr = morphgrad(img_rgb, mask);
     array th = tophat(img_rgb, mask);
     array bh = bottomhat(img_rgb, mask);
     array bp = border(img_rgb, 20, 30, 40, 50, 0.5);
     array bo = border(img_rgb, 20);
         wnd(0, 0).
image(img_rgb, 
"Input"          );
        wnd(1, 0).
image(er     , 
"Erosion"        );
        wnd(2, 0).
image(di     , 
"Dilation"       );
        wnd(0, 1).
image(op     , 
"Opening"        );
        wnd(1, 1).
image(cl     , 
"Closing"        );
        wnd(2, 1).
image(gr     , 
"Gradient"       );
        wnd(0, 2).
image(th     , 
"TopHat"         );
        wnd(1, 2).
image(bh     , 
"BottomHat"      );
        wnd(2, 2).
image(bl     , 
"Blur"           );
        wnd(0, 3).
image(bp     , 
"Border to Gray" );
        wnd(1, 3).
image(bo     , 
"Border to black");
    }
}
int main(int argc, char** argv)
{
    int device = argc > 1 ? atoi(argv[1]) : 0;
    try {
        printf("** ArrayFire Image Morphing Demo **\n\n");
        morphing_demo();
        fprintf(stderr, 
"%s\n", e.
what());
        throw;
    }
    return 0;
}