8#include "tpcclibConfig.h"
23static char *info[] = {
24 "Report the number of pixels belonging to labelled regions in mask image",
25 "in ECAT 6.3 or 7.x, NIfTI-1, or Analyze 7.5 format.",
27 "Usage: @P [Options] maskfile",
31 " Region labels are modified so that label 1 will represent the largest,",
32 " label 2 the second largets, and so on.",
33 " Notice that this option will overwrite the mask file.",
36 "See also: masklbl, imgthrs, maskconj, imgmask, mask2pxl",
38 "Keywords: image, mask, ROI",
57int main(
int argc,
char **argv)
59 int ai, help=0, version=0, verbose=1;
61 char maskfile[FILENAME_MAX];
69 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
72 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
74 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
75 if(strcasecmp(cptr,
"SORT")==0) {
76 sortLabels=1;
continue;
78 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
83 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
88 if(ai<argc) {
strlcpy(maskfile, argv[ai], FILENAME_MAX); ai++;}
89 if(ai<argc) {fprintf(stderr,
"Error: too many arguments.\n");
return(1);}
93 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
100 printf(
"maskfile := %s\n", maskfile);
101 printf(
"sortLabels := %d\n", sortLabels);
111 if(verbose>0) {printf(
"reading %s\n", maskfile); fflush(stdout);}
114 fprintf(stderr,
"Error: %s\n", mask.
statmsg);
115 if(verbose>1) printf(
"ret := %d\n", ret);
119 fprintf(stderr,
"Error: mask cannot be dynamic image.\n");
122 if(verbose>0 || sortLabels==0) {
123 printf(
"xdim := %d\n", mask.
dimx);
124 printf(
"ydim := %d\n", mask.
dimy);
125 printf(
"zdim := %d\n", mask.
dimz);
135 for(zi=0; zi<mask.
dimz; zi++)
136 for(yi=0; yi<mask.
dimy; yi++)
137 for(xi=0; xi<mask.
dimx; xi++)
138 if(mask.
m[zi][yi][xi][0]>mv)
139 mv=mask.
m[zi][yi][xi][0];
140 if(verbose>1) printf(
"maxval := %g\n", mv);
142 int maxLabel=(int)roundf(mv);
143 if(verbose>1) printf(
"maxlabel := %d\n", maxLabel);
145 fprintf(stderr,
"Error: mask file does not contain any labelled pixels.\n");
149 fprintf(stderr,
"Error: mask file contains too many labels.\n");
153 int pxlNr[maxLabel+1];
154 for(
int i=0; i<=maxLabel; i++) pxlNr[i]=0;
156 for(zi=0; zi<mask.
dimz; zi++)
157 for(yi=0; yi<mask.
dimy; yi++)
158 for(xi=0; xi<mask.
dimx; xi++) {
159 n=(int)roundf(mask.
m[zi][yi][xi][0]);
164 printf(
"Number of pixels per label:\n");
167 for(
int i=0; i<=maxLabel; i++) {
168 if(pxlNr[i]>0) printf(
"label_%d := %d\n", i, pxlNr[i]);
171 if(pxlNr[i]>ms) {ms=pxlNr[i]; bl=i;}
173 printf(
"totalNr := %d\n", n);
174 printf(
"largestRegion := %d\n", bl);
175 printf(
"largestSize := %d\n", ms);
180 if(sortLabels==0) {
imgEmpty(&mask);
return(0);}
186 int newLabel[maxLabel+1];
187 for(
int i=0; i<=maxLabel; i++) newLabel[i]=0;
190 newLabel[bl]=currLabel; pxlNr[bl]=0;
193 bl=ms=0; currLabel++;
194 for(
int i=1; i<=maxLabel; i++) {
195 if(pxlNr[i]>ms) {ms=pxlNr[i]; bl=i;}
197 if(verbose>10) printf(
"currLabel=%d ms=%d bl=%d\n", currLabel, ms, bl);
199 newLabel[bl]=currLabel; pxlNr[bl]=0;
202 printf(
"relabelling:\n");
203 for(
int i=1; i<=maxLabel; i++) printf(
" %d -> %d\n", i, newLabel[i]);
209 for(zi=0; zi<mask.
dimz; zi++)
210 for(yi=0; yi<mask.
dimy; yi++)
211 for(xi=0; xi<mask.
dimx; xi++) {
212 n=(int)roundf(mask.
m[zi][yi][xi][0]);
214 mask.
m[zi][yi][xi][0]=(float)newLabel[n];
222 if(verbose>2) printf(
"writing sorted mask...\n");
225 fprintf(stderr,
"Error: %s\n", mask.
statmsg);
229 if(verbose>0) printf(
"sorted mask written.\n\n");
void imgEmpty(IMG *image)
int imgRead(const char *fname, IMG *img)
int imgWrite(const char *fname, IMG *img)
Header file for libtpcimgio.
Header file for libtpcimgp.
Header file for libtpcmisc.
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
int tpcHtmlUsage(const char *program, char *text[], const char *path)
void tpcPrintBuild(const char *program, FILE *fp)
void tpcPrintUsage(const char *program, char *text[], FILE *fp)