/* Segment.c input depth and left image output segmented layer */ #include #include #include #include #include #include #include #include "segment.h" void save2file (unsigned char *p, int nrows, int ncols, char fn[50]) { FILE *fp; unsigned char *pt; int i, j; if ( !(fp = fopen (fn, "w")) ) { printf ("can't open %s\n", fn); exit (1); } pt = p; for (i=0;i= t_low && in[t] <= t_high) { in[t] = 1; } else { in[t] = 0; } } } } void topo_filter (unsigned char *p, int nrows, int ncols) { int i, j,k; int t0, t[4]; int flag, n; int shift; shift = nrows * ncols; do { flag = 0; t0 = 0; for (i=0;i 0 ) { t[0] = t0 - 1; t[1] = t0 + 1; t[2] = t0 - ncols; t[3] = t0 + ncols; n = 0; for (k=0;k<4;k++) { if (t[k] >= 0 && t[k] 0 ) n ++; } } if (n<=1) { p[t0] = 0; flag = 1; } } t0 ++; } } } while (flag); } void block_seg (unsigned char *buf, int nrows, int ncols, unsigned char *left, Block * block[MAX_B], int * bn) { int i,j,k,t; *bn = 0; for (i=DH-1;i>BB;i-=BB) { for (j=10;j0 && j 10) { if (top>i) top = i; if (right < j) right = j; if (right-lenncols = ((right - left)%2==0)?right-left:right-left+1; top += 20; left += 32; block[(*bn)-1]->left = left%2==0?left:left-1; block[(*bn)-1]->top = (top - 20)%2==0?top-20:top-19; block[(*bn)-1]->nrows = FH - block[(*bn)-1]->top; block[(*bn)-1]->buf = (unsigned char *)malloc (block[(*bn)-1]->nrows * block[(*bn)-1]->ncols); if (block[(*bn)-1]->buf == NULL) { printf ("block->buf null"); exit (1); } printf ("%d %d %d %d\n", block[0]->left, block[0]->top, block[0]->nrows, block[0]->ncols); fill_block (left_buf, block[(*bn)-1]); } void fill_block (unsigned char *left_buf, Block * block) { int i,j,k1, k2; k1 = block->top * FW + block->left; k2 = 0; for (i=0;inrows;i++) { for (j=0;jncols;j++) { /* block->buf[k2] = left_buf[(block->top+i)*FW + block->left + j]; */ block->buf[k2] = left_buf[k1]; k2 ++; k1 ++; } k1 += FW - block->ncols; } }