distancetransform_c.c

来自「基于VPM642的距离变换程序」· C语言 代码 · 共 62 行

C
62
字号
#define MAX_INT 255   // Max int set for use in the mask
DistanceTransform_C(const unsigned char indata[], unsigned char outdata[],int width,  int height )
{
  /* initialize local variables */
  int weight[3];                       // weights for different maps
  int i, j,minP;
  
  weight[0] = 3;
  weight[1] = 4;
  weight[2] = MAX_INT;

  //initialize dest
  for(i=0; i<height; i++){
    for( j=0; j<width; j++){
       (outdata[((i)*width)+(j)]) = (indata[((i)*width)+(j)]);
    }
  } // end for loop

//Forward Scan

  for(i=2; i<height ; i++){
    for( j=2; j<width-2 ;j++){
       minP = outdata[((i-1)*width)+(j-1)] + weight[1];
       minP = _min2(minP, outdata[((i-1)*width)+(j)] + weight[0]);
       minP = _min2(minP, outdata[((i-1)*width)+(j+1)] + weight[1]);
       minP = _min2(minP, outdata[((i)*width)+(j-1)] + weight[0]);
       minP = _min2(minP, outdata[((i)*width)+(j)]);
       minP = _min2(minP, outdata[((i-1)*width)+(j-2)] + weight[2]);
       minP = _min2(minP, outdata[((i-1)*width)+(j+2)] + weight[2]);
       minP = _min2(minP, outdata[((i-2)*width)+(j-1)] + weight[2]);
       minP = _min2(minP, outdata[((i-2)*width)+(j+1)] + weight[2]);
       
	   outdata[((i)*width)+(j)] = (unsigned char)minP;
    }
  } // end for loop forward scan

//Backward Scan
  for(i=(height-3); i>-1 ; i--){
    for( j=(width-3); j>1 ;j--){
       minP = outdata[((i+1)*width)+(j-1)] + weight[1];
       minP = _min2(minP, outdata[((i+1)*width)+(j)] + weight[0]);
       minP = _min2(minP, outdata[((i+1)*width)+(j+1)] + weight[1]);
       minP = _min2(minP, outdata[((i)*width)+(j+1)] + weight[0]);
       minP = _min2(minP, outdata[((i)*width)+(j)]);
       minP = _min2(minP, outdata[((i+1)*width)+(j-2)] + weight[2]);
       minP = _min2(minP, outdata[((i+1)*width)+(j+2)] + weight[2]);
       minP = _min2(minP, outdata[((i+2)*width)+(j-1)] + weight[2]);
       minP = _min2(minP, outdata[((i+2)*width)+(j+1)] + weight[2]);

       outdata[(i*width)+(j)] = (unsigned char)minP;
    }
  } // end for loop backward scan

//Clamp at 255 since output is 8 bit
  for(i=0; i<height; i++){
    for(j=0; j<width ;j++){
       outdata[(i)*width+j] = _min2(outdata[(i)*width+j], 255);
    }
  }
} 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?