Exemplo n.º 1
0
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 */
}
Exemplo n.º 3
0
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(&regions,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;
}