template <class T1, class T2> void dt3d_binary(T1 *indata, T2 *outdata, long int * label, const long int *sz, unsigned char tag) { long int len = sz[0]*sz[1]*sz[2]; long int i; float *tmpdata = new float [len]; for (i=0; i<len; i++) { tmpdata[i] = (float)indata[i]; if (tag ==0) if (tmpdata[i]>0) tmpdata[i] = 0; else tmpdata[i] = INF; else if (tmpdata[i]>0) tmpdata[i] = INF; else tmpdata[i] = 0; } dt3d(tmpdata, label, sz); for (i=0; i<len; i++) outdata[i] = (T2)tmpdata[i]; if (tmpdata) {delete [] tmpdata; tmpdata =0;} }
void dt3d_binary(float *data, long int * label, const long int *sz, unsigned char tag) { long int i,j,k; float *ptr; long int tmp_k, tmp_j; long int sz10 = sz[0]*sz[1]; for (k = 0; k < sz[2]; k++) { tmp_k = k*sz10; for (j = 0; j < sz[1]; j++) { tmp_j = j*sz[0]; for (i = 0; i < sz[0]; i++) { ptr = data + tmp_k + tmp_j + i; if (tag == 0) //calculate the distance transform for zero value pixels if ( *ptr > 0 ) *ptr = 0; else *ptr = FLOAT_INF; else //calculate the distance transform for non-zero value pixels if ( *ptr > 0 ) *ptr = FLOAT_INF; else *ptr = 0; } } } dt3d(data, label, sz); }