[Scipy-svn] r4123 - trunk/scipy/ndimage/src/segment
scipy-svn at scipy.org
scipy-svn at scipy.org
Wed Apr 9 21:00:53 EDT 2008
Author: tom.waite
Date: 2008-04-09 20:00:48 -0500 (Wed, 09 Apr 2008)
New Revision: 4123
Modified:
trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c
Log:
Begin region grow functions
Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c
===================================================================
--- trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-10 01:00:22 UTC (rev 4122)
+++ trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-10 01:00:48 UTC (rev 4123)
@@ -1469,3 +1469,189 @@
}
+int NI_GrowRegion2D(int rows, int cols, double *rawimage, unsigned short *label,
+ objStruct expanded_ROI[], objStruct newgrow_ROI[], double cutoff, int Label,
+ int N_connectivity){
+
+ int i, j, p, m;
+ int offset;
+ int offsetM, offsetP;
+ int status;
+ int T[8], count;
+ double value;
+ bool change;
+
+ while(1){
+ change = FALSE;
+ for(i = 1; i < rows-1; ++i){
+ offset = i * cols;
+ offsetM = offset - cols;
+ offsetP = offset + cols;
+ for(j = 1; j < cols-1; ++j){
+ m = label[offset+j];
+ if(!m){
+ /* un-labeled pixel */
+ value = rawimage[offset+j];
+ if(value > cutoff){
+ /* check for N-connectivity */
+ T[0] = label[offset+j+1];
+ T[1] = label[offsetM+j+1];
+ T[2] = label[offsetM+j];
+ T[3] = label[offsetM+j-1];
+ T[4] = label[offset+j-1];
+ T[5] = label[offsetP+j-1];
+ T[6] = label[offsetP+j];
+ T[7] = label[offsetP+j+1];
+ count = 0;
+ for(p = 0; p < 8; ++p){
+ count += T[p];
+ }
+ if(count > N_connectivity){
+ label[offset+j] = Label;
+ change = TRUE;
+ }
+ }
+ }
+ }
+ }
+ if(!change) break;
+ }
+
+ /* get new bounding box */
+
+ status = 1;
+
+ return(status);
+
+}
+
+int NI_GrowRegion3D(int layers, int rows, int cols, double *rawimage, unsigned short *label,
+ objStruct expanded_ROI[], objStruct newgrow_ROI[], double cutoff, int Label,
+ int N_connectivity){
+
+ int i, j, k, m, p;
+ int offset;
+ int ptr;
+ int lOffset, rOffset;
+ int lOffsetP, lOffsetN;
+ int rOffsetP, rOffsetN;
+ int layerSize;
+ int status;
+ int T[26], count;
+ int LowX;
+ int LowY;
+ int LowZ;
+ int HighX;
+ int HighY;
+ int HighZ;
+ float centerX;
+ float centerY;
+ float centerZ;
+ double value;
+ bool change;
+
+ layerSize = rows * cols;
+ while(1){
+ change = FALSE;
+ for(i = 1; i < layers-1; ++i){
+ lOffset = i * layerSize;
+ lOffsetP = lOffset+layerSize;
+ lOffsetN = lOffset-layerSize;
+ for(j = 1; j < rows-1; ++j){
+ rOffset = j * cols;
+ rOffsetP = rOffset+cols;
+ rOffsetN = rOffset-cols;
+ for(k = 1; k < cols-1; ++k){
+ m = label[lOffset+rOffset+k];
+ if(!m){
+ /* un-labeled voxel */
+ value = rawimage[lOffset+rOffset+k];
+ if(value > cutoff){
+ /* check for N-connectivity */
+ T[0] = label[lOffset+rOffset+k+1];
+ T[1] = label[lOffset+rOffsetN+k+1];
+ T[2] = label[lOffset+rOffsetN+k];
+ T[3] = label[lOffset+rOffsetN+k-1];
+ T[4] = label[lOffset+rOffset+k-1];
+ T[5] = label[lOffset+rOffsetP+k-1];
+ T[6] = label[lOffset+rOffsetP+k];
+ T[7] = label[lOffset+rOffsetP+k+1];
+
+ T[8] = label[lOffsetN+rOffset+k];
+ T[9] = label[lOffsetN+rOffset+k+1];
+ T[10] = label[lOffsetN+rOffsetN+k+1];
+ T[11] = label[lOffsetN+rOffsetN+k];
+ T[12] = label[lOffsetN+rOffsetN+k-1];
+ T[13] = label[lOffsetN+rOffset+k-1];
+ T[14] = label[lOffsetN+rOffsetP+k-1];
+ T[15] = label[lOffsetN+rOffsetP+k];
+ T[16] = label[lOffsetN+rOffsetP+k+1];
+
+ T[17] = label[lOffsetP+rOffset+k];
+ T[18] = label[lOffsetP+rOffset+k+1];
+ T[19] = label[lOffsetP+rOffsetN+k+1];
+ T[20] = label[lOffsetP+rOffsetN+k];
+ T[21] = label[lOffsetP+rOffsetN+k-1];
+ T[22] = label[lOffsetP+rOffset+k-1];
+ T[23] = label[lOffsetP+rOffsetP+k-1];
+ T[24] = label[lOffsetP+rOffsetP+k];
+ T[25] = label[lOffsetP+rOffsetP+k+1];
+
+ count = 0;
+ for(p = 0; p < 26; ++p){
+ count += T[p];
+ }
+ if(count > N_connectivity){
+ label[lOffset+rOffset+k]= Label;
+ change = TRUE;
+ }
+ }
+ }
+ }
+ }
+ }
+ if(!change) break;
+ }
+
+
+ LowX = 32767;
+ LowY = 32767;
+ LowZ = 32767;
+ HighX = 0;
+ HighY = 0;
+ HighZ = 0;
+ count = 0;
+ centerX = (float)0.0;
+ centerY = (float)0.0;
+ centerZ = (float)0.0;
+ ptr = 0;
+ count = 0;
+ for(i = 0; i < layers; ++i){
+ for(j = 0; j < rows; ++j){
+ for(k = 0; k < cols; ++k){
+ m = label[ptr++];
+ if(m == Label){
+ if(i < LowZ) LowZ = i;
+ if(j < LowY) LowY = j;
+ if(k < LowX) LowX = k;
+ if(i > HighZ) HighZ = i;
+ if(j > HighY) HighY = j;
+ if(k > HighX) HighX = k;
+ centerX += (float)k;
+ centerY += (float)j;
+ centerZ += (float)i;
+ ++count;
+ }
+ }
+ }
+ }
+
+
+
+ status = 1;
+
+ return(status);
+
+}
+
+
More information about the Scipy-svn
mailing list