TPCCLIB
Loading...
Searching...
No Matches
imgeval.c
Go to the documentation of this file.
1
5/*****************************************************************************/
6#include "libtpcimgp.h"
7/*****************************************************************************/
8
9/*****************************************************************************/
17 IMG *img,
19 float *tac
20) {
21 return(imgAverageMaskTAC(img, NULL, tac));
22}
23/*****************************************************************************/
24
25/*****************************************************************************/
36 IMG *img,
39 IMG *timg,
41 float *tac
42) {
43 unsigned long long int pxlNr;
44
45 if(img==NULL || img->status<IMG_STATUS_OCCUPIED) return(1);
46 if(tac==NULL) return(2);
47 if(timg!=NULL) {
48 if(timg->status<IMG_STATUS_OCCUPIED) return(3);
49 /* check that image dimensions are the same */
50 if(timg->dimz!=img->dimz || timg->dimz<1) return(5);
51 if(timg->dimy!=img->dimy || timg->dimy<1) return(5);
52 if(timg->dimx!=img->dimx || timg->dimx<1) return(5);
53 }
54 /* compute the nr of pixels in the mask */
55 if(timg==NULL) {
56 pxlNr=img->dimz*img->dimy*img->dimx;
57 } else {
58 pxlNr=0;
59 for(int zi=0; zi<timg->dimz; zi++)
60 for(int yi=0; yi<timg->dimy; yi++)
61 for(int xi=0; xi<timg->dimx; xi++)
62 if(timg->m[zi][yi][xi][0]!=0.0) pxlNr++;
63 }
64 if(pxlNr<1) return(4);
65
66 /* compute the TAC */
67 for(int fi=0; fi<img->dimt; fi++) {
68 tac[fi]=0.0;
69 for(int zi=0; zi<img->dimz; zi++) {
70 for(int yi=0; yi<img->dimy; yi++) {
71 for(int xi=0; xi<img->dimx; xi++) {
72 if(timg==NULL) tac[fi]+=img->m[zi][yi][xi][fi];
73 else if(timg->m[zi][yi][xi][0]!=0.0) tac[fi]+=img->m[zi][yi][xi][fi];
74 }
75 }
76 }
77 tac[fi]/=(float)pxlNr;
78 //printf("pxlNr=%llu/%llu\n", pxlNr, (unsigned long long)img->dimz*img->dimy*img->dimx);
79 }
80 return(0);
81}
82/*****************************************************************************/
83
84/*****************************************************************************/
93 IMG *img,
95 float *avgauc
96) {
97
98 if(img->status<IMG_STATUS_OCCUPIED) return(1);
99 if(avgauc==NULL) return(2);
100 *avgauc=0.0;
101 unsigned long long pxlNr=img->dimz*img->dimy*img->dimx;
102 if(pxlNr<1) return(3);
103 for(int fi=0; fi<img->dimt; fi++) {
104 float fv=0.0;
105 float fl=img->end[fi]-img->start[fi]; if(fl<=0.0) return(4);
106 for(int pi=0; pi<img->dimz; pi++)
107 for(int yi=0; yi<img->dimy; yi++)
108 for(int xi=0; xi<img->dimx; xi++)
109 fv+=img->m[pi][yi][xi][fi];
110 fv/=(float)pxlNr;
111 *avgauc+=fv*fl;
112 }
113 return(0);
114}
115/*****************************************************************************/
116
117/*****************************************************************************/
128 IMG *img,
131 IMG *mask,
134 double *tac,
136 int verbose
137) {
138 if(verbose>0) printf("imgMaskTAC()\n");
139
140 if(img->status<IMG_STATUS_OCCUPIED) return(1);
141 if(mask->status<IMG_STATUS_OCCUPIED) return(2);
142 if(mask->dimz!=img->dimz) return(3);
143 if(mask->dimy!=img->dimy) return(4);
144 if(mask->dimx!=img->dimx) return(5);
145 if(img->dimt<1 || mask->dimt<1) return(6);
146 if(tac==NULL) return(7);
147
148 /* Initiate TAC */
149 for(int fi=0; fi<img->dimt; fi++) tac[fi]=0.0;
150 /* Add weighted sum to TAC */
151 double w=0.0;
152 for(int zi=0; zi<mask->dimz; zi++)
153 for(int yi=0; yi<mask->dimy; yi++)
154 for(int xi=0; xi<mask->dimx; xi++) if(mask->m[zi][yi][xi][0]>0.0) {
155 for(int fi=0; fi<img->dimt; fi++)
156 tac[fi]+=mask->m[zi][yi][xi][0]*img->m[zi][yi][xi][fi];
157 w+=mask->m[zi][yi][xi][0];
158 }
159 /* Divide sum TAC by sum weights */
160 for(int fi=0; fi<img->dimt; fi++) tac[fi]/=w;
161 if(verbose>1) printf("mask_sum := %g\n", w);
162 if(w<=0.0 && verbose>0)
163 fprintf(stderr, "Warning: zero mask applied to image.\n");
164
165 return(0);
166}
167/*****************************************************************************/
168
169/*****************************************************************************/
179 IMG *img,
181 INTEGER_LIST *list
182) {
183 /* Check the input */
184 if(img==NULL || list==NULL) return 1;
185
186 /* Clear any previous list contents */
187 if(list->nr>0) {integerListEmpty(list);}
188
189 /* Go through the mask image */
190 for(int zi=0; zi<img->dimz; zi++)
191 for(int yi=0; yi<img->dimy; yi++)
192 for(int xi=0; xi<img->dimx; xi++) {
193 int v=temp_roundf(img->m[zi][yi][xi][0]);
194 if(v>0) {
195 int ret=integerListAdd(list, v, 1);
196 if(ret<0) return(100+ret);
197 }
198 }
199 /* Sort the list */
200 integerListSort(list);
201
202 return 0;
203}
204/*****************************************************************************/
205
206/*****************************************************************************/
216 IMG *img,
219 IMG *mask,
221 int mv,
224 double *tac,
226 int verbose
227) {
228 if(verbose>0) printf("imgVoiMaskTAC(img, mask, %d, tac, %d)\n", mv, verbose);
229
230 if(img->status<IMG_STATUS_OCCUPIED) return(-1);
231 if(mask->status<IMG_STATUS_OCCUPIED) return(-2);
232 if(mask->dimz!=img->dimz) return(-3);
233 if(mask->dimy!=img->dimy) return(-4);
234 if(mask->dimx!=img->dimx) return(-5);
235 if(img->dimt<1 || mask->dimt<1) return(-6);
236 if(tac==NULL) return(-7);
237
238 /* Initiate TAC */
239 for(int fi=0; fi<img->dimt; fi++) tac[fi]=0.0;
240
241 /* Add the sum to TAC */
242 int pxlNr[img->dimt], badNr[img->dimt];
243 for(int fi=0; fi<img->dimt; fi++) pxlNr[fi]=badNr[fi]=0;
244 for(int zi=0; zi<mask->dimz; zi++) {
245 for(int yi=0; yi<mask->dimy; yi++) {
246 for(int xi=0; xi<mask->dimx; xi++) {
247 double mf=(int)temp_roundf(mask->m[zi][yi][xi][0]);
248 if(mf!=mv) continue;
249 for(int fi=0; fi<img->dimt; fi++) {
250 if(!isfinite(img->m[zi][yi][xi][fi])) {badNr[fi]++; continue;}
251 tac[fi]+=img->m[zi][yi][xi][fi]; pxlNr[fi]++;
252 }
253 }
254 }
255 }
256
257 /* Divide sum TAC by sum weights */
258 int minNr=pxlNr[0];
259 for(int fi=0; fi<img->dimt; fi++) {
260 if(badNr[fi]>0 && verbose>1) {
261 fprintf(stderr, "Warning: %d missing pixel values in frame %d.\n", badNr[fi], 1+fi);
262 fflush(stderr);
263 }
264 if(pxlNr[fi]==0) {
265 if(verbose>0) {
266 fprintf(stderr, "Warning: zero valid pixels in frame %d.\n", 1+fi); fflush(stderr);
267 }
268 tac[fi]=nan("");
269 }
270 if(verbose>1) {
271 printf("%d valid pixels inside mask in frame %d\n", pxlNr[fi], 1+fi); fflush(stdout);
272 }
273 tac[fi]/=(double)pxlNr[fi];
274 if(pxlNr[fi]<minNr) minNr=pxlNr[fi];
275 }
276
277 return(minNr);
278}
279/*****************************************************************************/
280
281/*****************************************************************************/
int imgAverageAUC(IMG *img, float *avgauc)
Definition imgeval.c:91
int imgAverageTAC(IMG *img, float *tac)
Definition imgeval.c:15
int imgMaskTAC(IMG *img, IMG *mask, double *tac, int verbose)
Definition imgeval.c:126
int imgMaskRoiNr(IMG *img, INTEGER_LIST *list)
Definition imgeval.c:176
int imgVoiMaskTAC(IMG *img, IMG *mask, int mv, double *tac, int verbose)
Definition imgeval.c:214
int imgAverageMaskTAC(IMG *img, IMG *timg, float *tac)
Definition imgeval.c:34
int integerListEmpty(INTEGER_LIST *l)
Definition intex.c:175
int integerListSort(INTEGER_LIST *l)
Definition intex.c:219
int integerListAdd(INTEGER_LIST *l, int v, int ifnew)
Definition intex.c:190
#define IMG_STATUS_OCCUPIED
Header file for libtpcimgp.
int temp_roundf(float e)
Definition petc99.c:20
unsigned short int dimx
float **** m
char status
unsigned short int dimt
float * start
unsigned short int dimz
unsigned short int dimy
float * end