Finite Difference Scheme for the Mean Curvature Motion. More...
#include <stdlib.h>
#include <tiffio.h>
#include "io_tiff_routine.h"
#include <time.h>
#include <math.h>
Go to the source code of this file.
Defines | |
#define | FATAL(MSG) |
#define | INFO(MSG) |
#define | DEBUG(MSG) |
Functions | |
static void | heat (float *ptr_out, float *ptr_in, size_t n_col, int i, int i_prev, int i_next, int j, int j_prev, int j_next, float dt) |
Computes one iteration of Heat Equation. | |
static void | mcm (float *ptr_out, float *ptr_in, size_t n_row, size_t n_col, float dt, float t_g) |
Computes one iteration of the Mean Curvature Motion. | |
int | main (int argc, char *argv[]) |
Main function call. |
Finite Difference Scheme for the Mean Curvature Motion.
requirements:
compilation:
usage: this programs requires 3 arguments written in the following order,
The normalized scale represents the scale at which a circle with radius disappears. The number of iterations needed is linked to normalized scale and time step by the following formula:
where is the normalized scale, the time step and the number of iterations.
Definition in file FDS_MCM.c.
#define DEBUG | ( | MSG | ) |
#define FATAL | ( | MSG | ) |
#define INFO | ( | MSG | ) |
static void heat | ( | float * | ptr_out, | |
float * | ptr_in, | |||
size_t | n_col, | |||
int | i, | |||
int | i_prev, | |||
int | i_next, | |||
int | j, | |||
int | j_prev, | |||
int | j_next, | |||
float | dt | |||
) | [static] |
Computes one iteration of Heat Equation.
This function applies the following Finite Difference Scheme for Heat Equation
where the discrete laplacian is given by
[out] | ptr_out | pointer to the output array |
[in] | ptr_in | pointer to the input array |
[in] | n_col | number of columns |
i | current row | |
i_prev | previous row | |
i_next | next row | |
j | current column | |
j_prev | previous column | |
j_next | next column | |
[in] | dt | time step |
Definition at line 138 of file FDS_MCM.c.
int main | ( | int | argc, | |
char * | argv[] | |||
) |
Main function call.
The program reads an image.tiff given as input, applies a Finite Difference Scheme for the Mean Curvature Motion at renormalized scale , writes the result as a new image.tiff and returns it as output.
Definition at line 357 of file FDS_MCM.c.
static void mcm | ( | float * | ptr_out, | |
float * | ptr_in, | |||
size_t | n_row, | |||
size_t | n_col, | |||
float | dt, | |||
float | t_g | |||
) | [static] |
Computes one iteration of the Mean Curvature Motion.
This function applies a Finite Difference Scheme for the Mean Curvature Motion
When , we denote by the direction orthogonal to and by the angle between the positive semiaxis and the gradient. Since
the continuous equation can be translated in the followig discrete version:
For the numerical evaluation of we adopt a linear finite difference scheme based on a stencil.
The later can be rewritten in a more synthetic form, using a discrete convolution with a variable kernel
We talk about since the depend on the direction of and can be calculated either from and or (as we do in the code to optimize the number of variables allocated) directly from the FDS of the partial derivatives and .
where we have denoted respectively by and the algebric sums at the numerator of and .
With the choice the following formulas hold for the :
Remember that the array representing the image is examinated as a matrix, i.e. : is the current row number and is the current column number. The infinitezimal increment is the pixel width and is set to .
At the borders, we symmetrize the image with respect to the axes and , i.e.
All these speculations are based on the hypothesis that . In fact , which means that, if , the Mean Curvature Motion is undefined and has no sense talking about or . Numerically, even if the gradient is , but small in modulus, its direction becomes substantially random, because it will be driven by rounding and approximation errors.
These considerations bring us to replace by half the laplacian, if is below a given threshold (experimentally set to ).
[out] | ptr_out | pointer to the output array |
[in] | ptr_in | pointer to the input array |
[in] | n_row | number of rows |
[in] | n_col | number of columns |
[in] | dt | time step |
[in] | t_g | threshold for the gradient |
Definition at line 281 of file FDS_MCM.c.