49 int frame, plane, i, j, ret;
60 for(plane=0; plane<img->
dimz; plane++)
61 for(j=0; j<img->
dimy; j++)
for(i=0; i<img->
dimx; i++) {
63 if(img->
m[plane][j][i][frame]<minValue)
64 timg->
m[plane][j][i][frame]=1.0;
65 else if(img->
m[plane][j][i][frame]>maxValue)
66 timg->
m[plane][j][i][frame]=2.0;
68 timg->
m[plane][j][i][frame]=0.0;
93 int frame, plane, i, j;
97 for(plane=0; plane<img->
dimz; plane++)
98 for(j=0; j<img->
dimy; j++)
for(i=0; i<img->
dimx; i++)
99 if(template->m[plane][j][i][0]==1.0) {
100 for(frame=0; frame<img->
dimt; frame++)
101 img->
m[plane][j][i][frame]=minValue;
102 }
else if(template->m[plane][j][i][0]==2.0) {
103 for(frame=0; frame<img->
dimt; frame++)
104 img->
m[plane][j][i][frame]=maxValue;
124 int frame, plane, i, j;
127 for(plane=0; plane<img->
dimz; plane++)
128 for(j=0; j<img->
dimy; j++)
for(i=0; i<img->
dimx; i++)
129 for(frame=0; frame<img->
dimt; frame++)
130 if(img->
m[plane][j][i][frame]<minValue)
131 img->
m[plane][j][i][frame]=0.0;
132 else if(img->
m[plane][j][i][frame]>maxValue)
133 img->
m[plane][j][i][frame]=maxValue;
149 if(img->
dimt>1)
return(2);
150 for(plane=0; plane<img->
dimz; plane++)
151 for(j=0; j<img->
dimy; j++)
for(i=0; i<img->
dimx; i++) {
152 if(img->
m[plane][j][i][0]>0.0) img->
m[plane][j][i][0]=0.0;
153 else img->
m[plane][j][i][0]=-1.0;
180 int p, i, j, maxp=0, maxi=0, maxj=0;
184 if(sumimg->
dimt>1)
return(3);
185 if(cluster->
dimt>1)
return(4);
187 if(sumimg->
dimz!=cluster->
dimz)
return(6);
191 for(p=0; p<sumimg->
dimz; p++) {
192 for(j=0; j<sumimg->
dimy; j++)
for(i=0; i<sumimg->
dimx; i++)
193 if(cluster->
m[p][j][i][0]<-0.1) {
194 if(sumimg->
m[p][j][i][0]>*max) {
195 *max=sumimg->
m[p][j][i][0]; maxp=p; maxj=j; maxi=i;
201 *plane=maxp; *row=maxj; *col=maxi;
248 printf(
"imgsegmClusterExpand(cimg, simg, dimg, %d, %d, %d, %d, %d, %d, %d, %f, %f, %d)\n",
249 clusterID, pi, ri, ci, pj, rj, cj, CVlim, CClim, verbose);
257 if(pi<0 || ri<0 || ci<0 || pi>=cimg->
dimz || ri>=cimg->
dimy || ci>=cimg->
dimx) {
258 if(verbose>1) printf(
"pixels does not reside inside image\n");
263 if(cimg->
m[pi][ri][ci][0]>=-0.1) {
265 printf(
"pixel already belongs to cluster %g\n", cimg->
m[pi][ri][ci][0]);
271 float mean=0.5*(simg->
m[pi][ri][ci][0]+simg->
m[pj][rj][cj][0]);
272 float a=simg->
m[pi][ri][ci][0]-
mean;
273 float b=simg->
m[pj][rj][cj][0]-
mean;
275 if(fabs(
mean)>1.0e-10) cv=(a*a + b*b) /
mean;
else cv=0.0;
276 if(verbose>2) printf(
"cv=%g CVlim=%g mean=%g\n", cv, CVlim,
mean);
278 if(verbose>2) printf(
"AUCs are not matching, %g>%g\n", cv, CVlim);
286 if(verbose>3) printf(
" r=%g CClim=%g\n", r, CClim);
288 if(verbose>2) printf(
"TACs are not correlating, %g<%g\n", r, CClim);
294 cimg->
m[pi][ri][ci][0]=clusterID;
296 printf(
" [%d][%d][%d] belongs to cluster %d\n", pi, ri, ci, clusterID);
301 for(
int pk=pi-1; pk<=pi+1; pk++)
if(pk>=0 && pk<cimg->dimz)
302 for(
int rk=ri-1; rk<=ri+1; rk++)
if(rk>=0 && rk<cimg->dimy)
303 for(
int ck=ci-1; ck<=ci+1; ck++)
if(ck>=0 && ck<cimg->dimx)
304 if((pk!=pi || rk!=ri || ck!=ci) && cimg->
m[pk][rk][ck][0]<-0.1) {
306 pk, rk, ck, pj, rj, cj, CVlim, CClim, verbose);
307 if(ret>1)
return(ret);
331 float sumx=0.0, sumy=0.0, sumsx=0.0, sumsy=0.0, sumxy=0.0, r, q;
333 if(nr<1 || x==NULL || y==NULL)
return(0.0);
334 if(nr<3)
return(1.0);
335 for(i=0; i<nr; i++) {
336 sumx+=x[i]; sumy+=y[i];
337 sumsx+=x[i]*x[i]; sumsy+=y[i]*y[i];
340 q=(sumsx - sumx*sumx/(float)nr) * (sumsy - sumy*sumy/(
float)nr);
341 if(q<=0.0)
return(1.0);
342 r=(sumxy-((sumx*sumy)/(float)nr)) / sqrt(q);
372 if(dimg==NULL || cimg==NULL || avg==NULL)
return(-1);
376 if(verbose>0) printf(
"calculating avg of cluster %d:", clusterID);
377 for(fi=0; fi<dimg->
dimt; fi++) avg[fi]=0.0;
379 for(pi=0; pi<cimg->
dimz; pi++)
380 for(ri=0; ri<cimg->
dimy; ri++)
381 for(ci=0; ci<cimg->
dimx; ci++)
382 if(fabs(cimg->
m[pi][ri][ci][0]-(
float)clusterID)<0.1) {
383 for(fi=0; fi<dimg->
dimt; fi++)
384 avg[fi]+=dimg->
m[pi][ri][ci][fi];
387 if(n>0)
for(fi=0; fi<dimg->
dimt; fi++) avg[fi]/=(
float)n;
388 if(verbose>0) printf(
" %lld pixels\n", n);
410 for(pj=pi-1; pj<=pi+1; pj++)
if(pj>=0 && pj<cimg->dimz)
411 for(rj=ri-1; rj<=ri+1; rj++)
if(rj>=0 && rj<cimg->dimy)
412 for(cj=ci-1; cj<=ci+1; cj++)
if(cj>=0 && cj<cimg->dimx)
413 if((pi!=pj || ri!=rj || ci!=cj) && cimg->
m[pj][rj][cj][0]<-0.1)
return(0);
440 float cc, best_cc, best_ID;
442 best_ID=-1.0; best_cc=-1.0e+20;
443 for(pj=pi-1; pj<=pi+1; pj++)
if(pj>=0 && pj<cimg->dimz)
444 for(rj=ri-1; rj<=ri+1; rj++)
if(rj>=0 && rj<cimg->dimy)
445 for(cj=ci-1; cj<=ci+1; cj++)
if(cj>=0 && cj<cimg->dimx)
446 if((pi!=pj || ri!=rj || ci!=cj)) {
450 best_ID=cimg->
m[pj][rj][cj][0];
453 if(best_ID<0.0)
return(1);
454 cimg->
m[pi][ri][ci][0]=best_ID;
461int imgsegmSimilarSort(
const void *mask1,
const void *mask2)
463 if( ((IMGSEGMMASK*)mask1)->order > ((IMGSEGMMASK*)mask2)->order )
return(-1);
464 else if( ((IMGSEGMMASK*)mask1)->order < ((IMGSEGMMASK*)mask2)->order )
return(+1);
490 int ret, pi, ri, ci, pj, rj, cj, mi, mj, fi, maskNr, smod;
492 IMGSEGMMASK mask[125];
495 if(verbose>0) printf(
"in filterSimilar(input, %d, %d, output)\n", smoothDim, smoothNr);
498 if(input->
dimt<2)
return(2);
499 if(smoothDim==3) smod=1;
else smod=2;
500 if(smoothNr<2) smoothNr=9;
505 if(ret)
return(10+ret);
510 if(ret) {
imgEmpty(&sum);
return(20+ret);}
513 for(pi=0; pi<input->
dimz; pi++) {
514 if(input->
dimz>1) {fprintf(stdout,
"."); fflush(stdout);}
515 for(ri=0; ri<input->
dimy; ri++) {
516 for(ci=0; ci<input->
dimx; ci++) {
518 for(mi=0; mi<125; mi++) mask[mi].order=0;
520 for(pj=pi-smod; pj<=pi+smod; pj++)
if(pj>=0 && pj<input->dimz) {
521 for(rj=ri-smod; rj<=ri+smod; rj++)
if(rj>=0 && rj<input->dimy) {
522 for(cj=ci-smod; cj<=ci+smod; cj++)
if(cj>=0 && cj<input->dimx) {
523 mask[mi].p=pj; mask[mi].r=rj; mask[mi].c=cj;
525 mask[mi].dauc=fabs(sum.
m[pi][ri][ci][0]-sum.
m[pj][rj][cj][0]);
534 for(mi=0; mi<maskNr; mi++) {
536 for(mj=0; mj<maskNr; mj++) {
537 if(mask[mj].dauc>mask[mi].dauc) mask[mi].order++;
538 if(mask[mj].mrl>mask[mi].mrl) mask[mi].order++;
541 qsort(mask, maskNr,
sizeof(IMGSEGMMASK), imgsegmSimilarSort);
543 mj=smoothNr;
if(mj>maskNr/2) mj=maskNr/2;
544 for(fi=0; fi<input->
dimt; fi++) {
545 output->
m[pi][ri][ci][fi]=0.0;
546 for(mi=0; mi<mj; mi++) {
548 output->
m[pi][ri][ci][fi]+=
549 input->
m[mask[mi].p][mask[mi].r][mask[mi].c][fi];
551 output->
m[pi][ri][ci][fi]/=(double)mj;
556 if(input->
dimz>1) {fprintf(stdout,
"\n"); fflush(stdout);}
575 long long i, mrl=0, rl=0;
576 char last_sign=0, sign;
579 if(y1[i]>y2[i]) sign=1;
else if(y1[i]<y2[i]) sign=-1;
else sign=0;
580 if(sign!=last_sign) {
581 rl=0; last_sign=sign;
583 if(sign!=0) {rl++;
if(rl>mrl) mrl=rl;}
int imgAllocateWithHeader(IMG *image, int planes, int rows, int columns, int frames, IMG *image_from)
void imgEmpty(IMG *image)
int imgFrameIntegral(IMG *img, int first, int last, IMG *iimg, int verbose)
int imgsegmThresholdMask(IMG *img, float minValue, float maxValue, IMG *timg)
int imgsegmCheckNeighbours(IMG *cimg, int pi, int ri, int ci)
int imgsegmClusterMean(IMG *dimg, IMG *cimg, int clusterID, float *avg, int verbose)
int imgsegmMaskToCluster(IMG *img)
int imgsegmFindBestNeighbour(IMG *dimg, IMG *cimg, int pi, int ri, int ci)
int imgsegmFindMaxOutsideClusters(IMG *sumimg, IMG *cluster, float *max, int *plane, int *row, int *col)
float imgsegmPearson(float *x, float *y, long long nr)
int imgsegmThreshold(IMG *img, float minValue, float maxValue)
int imgsegmThresholdByMask(IMG *img, IMG *template, float minValue, float maxValue)
int imgsegmCalcMRL(float y1[], float y2[], long long n)
int imgsegmSimilar(IMG *input, int smoothDim, int smoothNr, IMG *output, int verbose)
int imgsegmClusterExpand(IMG *cimg, IMG *simg, IMG *dimg, int clusterID, int pi, int ri, int ci, int pj, int rj, int cj, float CVlim, float CClim, int verbose)
#define IMG_STATUS_OCCUPIED
Header file for libtpcimgp.
int mean(double *x, double *y, int nr, double *xmean, double *xsd, double *ymean, double *ysd)