ArrayFire: image_processing/gradient_diffusion.cpp (original) (raw)

#include <stdio.h>

#include

using namespace af;

static const unsigned ITERS = 64;

float mx = max(p_in);

float mn = min(p_in);

return (p_in - mn) / (mx - mn);

}

int w = 5;

if (p_in.dims(0) < 512) w = 3;

if (p_in.dims(0) > 2048) w = 7;

int h = 5;

if (p_in.dims(0) < 512) h = 3;

if (p_in.dims(0) > 2048) h = 7;

array ker = gaussianKernel(w, h);

array smooth = convolve(p_in, ker);

for (unsigned i = 1; i < ITERS; ++i) smooth = convolve(smooth, ker);

sobel(Gx, Gy, smooth, 3);

return normalize(hypot(Gx, Gy));

}

array in, edges, smoothed;

void anisotropicSmoothing() {

}

int main(int argc, char *argv[]) {

int device = argc > 1 ? atoi(argv[1]) : 0;

try {

printf("** ArrayFire Gradient Anisotropic Smoothing Demo **\n");

Window myWindow("Gradient Anisotropic Smoothing");

in = loadImage(ASSETS_DIR "/examples/images/man.jpg", false);

array sEdges = sobelFilter(in);

anisotropicSmoothing();

sobel(Gx, Gy, smoothed, 3);

edges = normalize(hypot(Gx, Gy));

while (!myWindow.close()) {

myWindow.grid(2, 2);

myWindow(0, 0).image(in / 255.0f, "Input Image");

myWindow(0, 1).image(normalize(smoothed),

"Anisotropically smooted Input");

myWindow(1, 0).image(normalize(sEdges),

"Gradient Magnitude after gaussian blur t=64");

myWindow(1, 1).image(normalize(edges),

"Gradient Magnitude after diffusion t=64");

myWindow.show();

}

printf(

"\nAnisotropic Diffusion avg runtime for current image in Seconds: "

"%g\n",

timeit(anisotropicSmoothing));

fprintf(stderr, "%s\n", e.what());

throw;

}

return 0;

}

Window object to render af::arrays.

A multi dimensional data container.

dim4 dims() const

Get dimensions of the array.

An ArrayFire exception class.

virtual const char * what() const

Returns an error message for the exception in a string format.

AFAPI array hypot(const array &lhs, const array &rhs)

C++ Interface to calculate the length of the hypotenuse of two inputs.

AFAPI void setDevice(const int device)

Sets the current device.

AFAPI array anisotropicDiffusion(const af::array &in, const float timestep, const float conductance, const unsigned iterations, const fluxFunction fftype=AF_FLUX_EXPONENTIAL, const diffusionEq diffusionKind=AF_DIFFUSION_GRAD)

C++ Interface for gradient anisotropic(non-linear diffusion) smoothing.

AFAPI void sobel(array &dx, array &dy, const array &img, const unsigned ker_size=3)

C++ Interface for extracting sobel gradients.

AFAPI array loadImage(const char *filename, const bool is_color=false)

C++ Interface for loading an image.

AFAPI double timeit(void(*fn)())