21 for(zi=0; zi<img->
dimz; zi++)
22 for(yi=0; yi<img->
dimy; yi++)
23 for(xi=0; xi<img->
dimx; xi++)
24 if(img->
m[zi][yi][xi][0]>0.0) n++;
41 if(img==NULL || se==NULL)
return(-1);
42 if(img->
dimx<1 || img->
dimy<1 || img->
dimz<1)
return(-2);
44 if(se->
dimx%2==0 || se->
dimy%2==0 || se->
dimz%2==0)
return(-4);
49 if(
imgDup(img, &orig)!=0)
return(-5);
51 int zi, yi, xi, zj, yj, xj;
52 for(zi=0; zi<orig.
dimz; zi++)
53 for(yi=0; yi<orig.
dimy; yi++)
54 for(xi=0; xi<orig.
dimx; xi++)
55 if(orig.
m[zi][yi][xi][0]>0.0) {
58 for(zs=0; zs<se->
dimz; zs++)
59 for(ys=0; ys<se->
dimy; ys++)
60 for(xs=0; xs<se->
dimx; xs++)
61 if(se->
m[zs][ys][xs][0]>0.0) {
62 zj=zi+(zs-se->
dimz/2);
if(zj<0 || zj>=orig.
dimz)
continue;
63 yj=yi+(ys-se->
dimy/2);
if(yj<0 || yj>=orig.
dimy)
continue;
64 xj=xi+(xs-se->
dimx/2);
if(xj<0 || xj>=orig.
dimx)
continue;
65 if(orig.
m[zj][yj][xj][0]<miv) miv=orig.
m[zj][yj][xj][0];
67 if(!(miv>1.0E-20)) {img->
m[zi][yi][xi][0]=0.0; n++;}
87 if(img==NULL || se==NULL)
return(-1);
88 if(img->
dimx<1 || img->
dimy<1 || img->
dimz<1)
return(-2);
90 if(se->
dimx%2==0 || se->
dimy%2==0 || se->
dimz%2==0)
return(-4);
95 if(
imgDup(img, &orig)!=0)
return(-5);
97 int zi, yi, xi, zj, yj, xj;
98 for(zi=0; zi<orig.
dimz; zi++)
99 for(yi=0; yi<orig.
dimy; yi++)
100 for(xi=0; xi<orig.
dimx; xi++)
101 if(orig.
m[zi][yi][xi][0]==0.0) {
104 for(zs=0; zs<se->
dimz; zs++)
105 for(ys=0; ys<se->
dimy; ys++)
106 for(xs=0; xs<se->
dimx; xs++)
107 if(se->
m[zs][ys][xs][0]>0.0) {
108 zj=zi+(zs-se->
dimz/2);
if(zj<0 || zj>=orig.
dimz)
continue;
109 yj=yi+(ys-se->
dimy/2);
if(yj<0 || yj>=orig.
dimy)
continue;
110 xj=xi+(xs-se->
dimx/2);
if(xj<0 || xj>=orig.
dimx)
continue;
111 if(orig.
m[zj][yj][xj][0]>mav) mav=orig.
m[zj][yj][xj][0];
113 if(mav>0.0) {img->
m[zi][yi][xi][0]=mav; n++;}
134 const int structuring_element,
138 if(img==NULL)
return(1);
142 if(structuring_element==1) {
143 if(verbose>0) printf(
"making cube as the structuring element\n");
145 }
else if(structuring_element==2) {
146 if(verbose>0) printf(
"making rounded cube as the structuring element\n");
148 }
else if(structuring_element==3) {
149 if(verbose>0) printf(
"making star as the structuring element\n");
152 fprintf(stderr,
"Error: unsupported structuring element.\n");
155 if(verbose>0) {fflush(stdout);}
157 fprintf(stderr,
"Error: cannot allocate memory.\n");
164 if(structuring_element==1) {
168 img->
m[z][y][x][0]=1.0;
169 }
else if(structuring_element==2) {
173 if(z==1 || y==1 || x==1)
174 img->
m[z][y][x][0]=1.0;
176 img->
m[z][y][x][0]=0.0;
177 }
else if(structuring_element==3) {
186 img->
m[z][y][x][0]=1.0;
188 img->
m[z][y][x][0]=0.0;
194 printf(
"\nplanes 1-3\n");
198 printf(
" %g", img->
m[z][y][x][0]);
220 if(img==NULL)
return;
222 for(zi=0; zi<img->
dimz; zi++)
223 for(yi=0; yi<img->
dimy; yi++)
224 for(xi=0; xi<img->
dimx; xi++)
225 if(fabs(img->
m[zi][yi][xi][0])>1.0E-12)
226 img->
m[zi][yi][xi][0]=0.0;
228 img->
m[zi][yi][xi][0]=1.0;
245 if(mask1==NULL || mask2==NULL)
return(1);
246 if(mask1->
dimx<1 || mask1->
dimy<1 || mask1->
dimz<1)
return(2);
247 if(mask1->
dimx!=mask2->
dimx)
return(3);
248 if(mask1->
dimy!=mask2->
dimy)
return(4);
249 if(mask1->
dimz!=mask2->
dimz)
return(5);
252 for(zi=0; zi<mask1->
dimz; zi++)
253 for(yi=0; yi<mask1->
dimy; yi++)
254 for(xi=0; xi<mask1->
dimx; xi++) {
255 if(fabs(mask1->
m[zi][yi][xi][0])<1.0E-12 ||
256 fabs(mask2->
m[zi][yi][xi][0])<1.0E-12)
258 mask1->
m[zi][yi][xi][0]=0.0;
260 mask1->
m[zi][yi][xi][0]=1.0;
292 if(verbose>0) {printf(
"%s()\n", __func__); fflush(stdout);}
293 if(mask1==NULL || mask2==NULL || mask1==mask2)
return(1);
295 if(mask1->
dimx<1 || mask1->
dimy<1 || mask1->
dimz<1)
return(3);
296 if(verbose>1) printf(
"mask dimensions := %d x %d x %d\n", mask1->
dimx, mask1->
dimy, mask1->
dimz);
303 if(verbose>0) fprintf(stderr,
"Error: cannot make initial copy of mask.\n");
307 if(verbose>0) fprintf(stderr,
"Warning: empty mask.\n");
310 if(verbose>1) printf(
"mask contains %lld foreground pixels.\n", nr);
312 for(
int zi=0; zi<mask2->
dimz; zi++)
313 for(
int yi=0; yi<mask2->
dimy; yi++)
314 for(
int xi=0; xi<mask2->
dimx; xi++)
315 if(mask2->
m[zi][yi][xi][0]!=0.0)
316 printf(
" %d,%d,%d\n", zi, yi, xi);
320 int ret=0, nextLabel=2;
321 for(
int zi=0; zi<mask2->
dimz; zi++)
322 for(
int yi=0; yi<mask2->
dimy; yi++)
323 for(
int xi=0; xi<mask2->
dimx; xi++)
324 if(mask2->
m[zi][yi][xi][0]==1.0) {
327 if(verbose>2) printf(
"%lld pixels labelled as %d\n", nr, nextLabel);
331 if(verbose>0) fprintf(stderr,
"Error: Flood fill failed.\n");
334 if(verbose>0) printf(
"%d regions labelled.\n", nextLabel-2);
335 if(n!=NULL) *n=nextLabel-2;
372 printf(
"%s(mask, %d, %d, %d, %d)\n", __func__, sz, sy, sx, label);
377 if(sx<0 || sy<0 || sz<0 || sx>=m->
dimx || sy>=m->
dimy || sz>=m->
dimz)
return(3);
378 if(label<2)
return(4);
386 if(
pxlAdd(&pxls, &pxl)!=0) {
387 if(verbose>0) fprintf(stderr,
"Error: cannot add seed pixel to stack.\n");
392 unsigned long long int pxlNr=0;
393 while(pxls.
pxlNr>0) {
398 if(verbose>100) printf(
" m[%d][%d][%d] := %g\n", pxl.
z, pxl.
y, pxl.
x, m->
m[pxl.
z][pxl.
y][pxl.
x][0]);
399 if(pxl.
z<0 || pxl.
z>=m->
dimz || pxl.
y<0 || pxl.
y>=m->
dimy || pxl.
x<0 || pxl.
x>=m->
dimx)
401 if(m->
m[pxl.
z][pxl.
y][pxl.
x][0]!=1.0)
continue;
402 m->
m[pxl.
z][pxl.
y][pxl.
x][0]=(float)label;
403 if(verbose>100) printf(
" -> m[%d][%d][%d] := %g\n", pxl.
z, pxl.
y, pxl.
x, m->
m[pxl.
z][pxl.
y][pxl.
x][0]);
408 if(verbose>100) printf(
" pxls.pxlNr := %lld\n", pxls.
pxlNr);
409 unsigned long long int i=0;
410 for(
int dz=-1; dz<2; dz++)
for(
int dy=-1; dy<2; dy++)
for(
int dx=-1; dx<2; dx++) {
411 if(dz==0 && dy==0 && dx==0)
continue;
412 pxls.
p[i].
z=pxl.
z+dz; pxls.
p[i].
y=pxl.
y+dy; pxls.
p[i].
x=pxl.
x+dx;
417 if(verbose>1) printf(
" %lld pixels labelled.\n", pxlNr);
418 if(n!=NULL) *n=pxlNr;
419 if(pxlNr==0)
return(21);
437 if(img==NULL)
return(1);
439 if(dimx<1 || dimy<1 || dimz<1)
return(2);
441 for(
int z=0; z<dimz; z++) {
442 for(
int y=0; y<dimy; y++) {
443 for(
int x=0; x<dimx; x++)
if(!(img->
m[z][y][x][0]<0.5) && img->
m[z][y][x][0]!=
id) {
444 int x1=x, x2=x, y1=y, y2=y, z1=z, z2=z;
453 for(
int nz=z1; nz<=z2; nz++)
454 for(
int ny=y1; ny<=y2; ny++)
455 for(
int nx=x1; nx<=x2; nx++)
456 if(z!=nz || y!=ny || x!=nx)
457 if(img->
m[nz][ny][nx][0]<0.5)
458 img->
m[nz][ny][nx][0]=id;
int imgAllocate(IMG *image, int planes, int rows, int columns, int frames)
int imgDup(IMG *img1, IMG *img2)
void imgEmpty(IMG *image)
int imgThresholdMaskCount(IMG *img, float minValue, float maxValue, IMG *timg, long long *count)
int pxlMakeRoom(IMG_PIXELS *list, long long int i, long long int n)
void pxlFree(IMG_PIXELS *pxl)
#define IMG_STATUS_OCCUPIED
int pxlGet(IMG_PIXELS *list, long long int i, IMG_PIXEL *pxl)
int pxlAdd(IMG_PIXELS *list, IMG_PIXEL *pxl)
void pxlInit(IMG_PIXELS *pxl)
Header file for libtpcimgp.
long long imgMaskCount(IMG *img)
int imgMaskRegionLabeling(IMG *mask1, IMG *mask2, int *n, int verbose)
int imgMaskCloak(IMG *img, int dim, float id)
int imgMaskFloodFill(IMG *m, int sz, int sy, int sx, int label, long long *n, int verbose)
void imgMaskInvert(IMG *img)
int imgStructuringElement(IMG *img, const int structuring_element, int verbose)
int imgMaskDilate(IMG *img, IMG *se)
int imgMaskErode(IMG *img, IMG *se)
int imgMaskConjunction(IMG *mask1, IMG *mask2)