MATRIX3 majorityVoting3WithSquareStrel(MATRIX3 map, int halfEdge){ int dz = map.d1, z, k, cnt, tot; int dx = map.d2, x; int dy = map.d3, y; MATRIX3 res = allocateMatrix3(dz,dx,dy); MATRIX3 total = allocateMatrix3(dz,dx,dy); MATRIX3 count = allocateMatrix3(dz,dx,dy); for (z = 0; z < dz; z++) squareRegionCount(map.data[z],count.data[z],total.data[z],dx,dy,halfEdge); for (z = 0; z < dz; z++){ for (x = 0; x < dx; x++) for (y = 0; y < dy; y++){ cnt = tot = 0; for (k = -halfEdge; k <= halfEdge; k++) if (z + k >= 0 && z + k < dz){ tot += total.data[z + k][x][y]; cnt += count.data[z + k][x][y]; } if (cnt * 2 >= tot) res.data[z][x][y] = 1; else res.data[z][x][y] = 0; } } freeMatrix3(total); freeMatrix3(count); return res; }
void destroyPlnWeights(struct PlnWeights *pln) { freeArray(pln->inputMeans); freeArray(pln->inputStd); /* cluster centers and distance measure */ freeArray(pln->distanceMeasure); freeMatrix(pln->clusterCenters, pln->Nc); /* cluster weights */ freeMatrix3(pln->W, pln->Nc, pln->M); /* Unused entries which can be left uninitialized */ freeArray((double*)pln->Nv); /* samples in each cluster */ freeMatrix3(pln->R, pln->Nc, pln->N+1); freeMatrix3(pln->C, pln->Nc, pln->M); freeMatrix(pln->Et, pln->Nc); /* variance of outputs */ freeArray(pln->lambda); /* regularization parameter */ }
MATRIX3 fourConnectivity3(MATRIX3 image){ MATRIX3 visited = allocateMatrix3(image.d1,image.d2,image.d3); MATRIX3 regions = allocateMatrix3(image.d1,image.d2,image.d3); long *queueZ = (long *)malloc(image.d1 * image.d2 * image.d3 * sizeof(long)); long *queueX = (long *)malloc(image.d1 * image.d2 * image.d3 * sizeof(long)); long *queueY = (long *)malloc(image.d1 * image.d2 * image.d3 * sizeof(long)); long i, j, k, x, y, z, queueStart, queueEnd; int label = 0; initializeMatrix3(&visited,UNVISITED); initializeMatrix3(®ions,BACKGROUND); for (i = 0; i < image.d1; i++) for (j = 0; j < image.d2; j++) for (k = 0; k < image.d3; k++){ if (image.data[i][j][k] == BACKGROUND) continue; if (visited.data[i][j][k] == VISITED) continue; label++; queueX[0] = j; queueY[0] = k; queueZ[0] = i; queueStart = 0; queueEnd = 1; visited.data[i][j][k] = VISITED; while (queueEnd > queueStart){ x = queueX[queueStart]; y = queueY[queueStart]; z = queueZ[queueStart]; regions.data[z][x][y] = label; if (x-1 >= 0 && visited.data[z][x-1][y] != VISITED && image.data[z][x-1][y] != BACKGROUND){ visited.data[z][x-1][y] = VISITED; queueX[queueEnd] = x-1; queueY[queueEnd] = y; queueZ[queueEnd] = z; queueEnd++; } if (x+1 < image.d2 && visited.data[z][x+1][y] != VISITED && image.data[z][x+1][y] != BACKGROUND){ visited.data[z][x+1][y] = VISITED; queueX[queueEnd] = x+1; queueY[queueEnd] = y; queueZ[queueEnd] = z; queueEnd++; } if (y-1 >= 0 && visited.data[z][x][y-1] != VISITED && image.data[z][x][y-1] != BACKGROUND){ visited.data[z][x][y-1] = VISITED; queueX[queueEnd] = x; queueY[queueEnd] = y-1; queueZ[queueEnd] = z; queueEnd++; } if (y+1 < image.d3 && visited.data[z][x][y+1] != VISITED && image.data[z][x][y+1] != BACKGROUND){ visited.data[z][x][y+1] = VISITED; queueX[queueEnd] = x; queueY[queueEnd] = y+1; queueZ[queueEnd] = z; queueEnd++; } if (z-1 >= 0 && visited.data[z-1][x][y] != VISITED && image.data[z-1][x][y] != BACKGROUND){ visited.data[z-1][x][y] = VISITED; queueX[queueEnd] = x; queueY[queueEnd] = y; queueZ[queueEnd] = z-1; queueEnd++; } if (z+1 < image.d1 && visited.data[z+1][x][y] != VISITED && image.data[z+1][x][y] != BACKGROUND){ visited.data[z+1][x][y] = VISITED; queueX[queueEnd] = x; queueY[queueEnd] = y; queueZ[queueEnd] = z+1; queueEnd++; } queueStart++; } } free(queueZ); free(queueX); free(queueY); freeMatrix3(visited); return regions; }