TPCCLIB
Loading...
Searching...
No Matches
imgmaxp.c File Reference

Find the position of maximum pixel value in PET image file. More...

Go to the source code of this file.

Functions

int imgRangeWeightedMax (IMG *img, IMG_RANGE *r, IMG_PIXEL *maxp)

Detailed Description

Find the position of maximum pixel value in PET image file.

Author
Vesa Oikonen

Definition in file imgmaxp.c.

Function Documentation

◆ imgRangeWeightedMax()

int imgRangeWeightedMax ( IMG * img,
IMG_RANGE * r,
IMG_PIXEL * maxp )

Finds voxel value weighted voxel position inside specified image range.

Returns
0 if ok, 1 invalid volume status, 2 invalid range endings, 3 inconsistent range dimensions, 4 inconsistent dimensions
Parameters
imgPointer to IMG structure.
rPointer to image range inside IMG; enter NULL if whole IMG is used.
maxpPixel where max pixel position is written.

Definition at line 271 of file imgmaxp.c.

278 {
279 int zi, yi, xi, fi;
280 double wsum, wz, wy, wx, wf;
281
282 if(img->status<IMG_STATUS_OCCUPIED) return(1);
283 if(img->dimt<1 || img->dimz<1 || img->dimy<1 || img->dimx<1) return(1);
284 if(maxp==NULL) return(1);
285 wsum=wz=wy=wx=wf=0.0;
286
287 if(r!=NULL) {
288 if(r->z1<1 || r->y1<1 || r->x1<1 || r->f1<1) return(2);
289 if(r->z2<r->z1 || r->y2<r->y1 || r->x2<r->x1 || r->f2<r->f1) return(3);
290 if(r->z2>img->dimz || r->y2>img->dimy || r->x2>img->dimx || r->f2>img->dimt) return(4);
291
292 maxp->z=r->z1; maxp->y=r->y1; maxp->x=r->x1; maxp->f=r->f1;
293 for(zi=r->z1-1; zi<r->z2; zi++) {
294 for(yi=r->y1-1; yi<r->y2; yi++) {
295 for(xi=r->x1-1; xi<r->x2; xi++) {
296 for(fi=r->f1-1; fi<r->f2; fi++) {
297 wsum+=img->m[zi][yi][xi][fi];
298 wx+=(double)xi*img->m[zi][yi][xi][fi];
299 wy+=(double)yi*img->m[zi][yi][xi][fi];
300 wz+=(double)zi*img->m[zi][yi][xi][fi];
301 wf+=(double)fi*img->m[zi][yi][xi][fi];
302 }
303 }
304 }
305 }
306 } else {
307 maxp->x=maxp->y=maxp->z=maxp->f=1;
308 for(zi=0; zi<img->dimz; zi++) {
309 for(yi=0; yi<img->dimy; yi++) {
310 for(xi=0; xi<img->dimx; xi++) {
311 for(fi=0; fi<img->dimt; fi++) {
312 wsum+=img->m[zi][yi][xi][fi];
313 wx+=(double)xi*img->m[zi][yi][xi][fi];
314 wy+=(double)yi*img->m[zi][yi][xi][fi];
315 wz+=(double)zi*img->m[zi][yi][xi][fi];
316 wf+=(double)fi*img->m[zi][yi][xi][fi];
317 }
318 }
319 }
320 }
321 }
322 if(wsum<1.0E-08) return(5);
323 wx/=wsum; wy/=wsum; wz/=wsum; wf/=wsum;
324 maxp->x=1+(int)roundf(wx); maxp->y=1+(int)roundf(wy);
325 maxp->z=1+(int)roundf(wz); maxp->f=1+(int)roundf(wf);
326 return(0);
327}
#define IMG_STATUS_OCCUPIED
unsigned short int dimx
float **** m
char status
unsigned short int dimt
unsigned short int dimz
unsigned short int dimy