void sauvola(unsigned char * grayImage, unsigned char * biImage, int w, int h, int k, int windowSize)
{
int whalf = windowSize >> 1;
int i, j;
int IMAGE_WIDTH = w;
int IMAGE_HEIGHT = h;
// create the integral image
unsigned long * integralImg = (unsigned long*)malloc(IMAGE_WIDTH*IMAGE_HEIGHT*sizeof(unsigned long*));
unsigned long * integralImgSqrt = (unsigned long*)malloc(IMAGE_WIDTH*IMAGE_HEIGHT*sizeof(unsigned long*));
int sum = 0;
int sqrtsum = 0;
int index;
for (i = 0; i<IMAGE_HEIGHT; i++)
{
// reset this column sum
sum = 0;
sqrtsum = 0;
for (j = 0; j<IMAGE_WIDTH; j++)
{
index = i*IMAGE_WIDTH + j;
sum += grayImage[index];