8#include "tpcclibConfig.h"
25static char *info[] = {
26 "Make mask image from specified pixel(s).",
27 "Pixels can be specified as volume range definition files, or as file",
28 "containing list of pixel coordinates.",
29 "A template image (not modified) is needed to get mask dimensions.",
31 "Usage: @P [Options] templatefile maskfile pixel(s)",
36 "Volume range definition (vrd) file is an ASCII text file, which contains",
37 "pixel coordinates (x y z; 1..dimension) of the two opposite corners of",
38 "the extracted image volume, for example:",
39 " corner1 := 63 57 26",
40 " corner2 := 84 71 44",
41 "One or more pixel coordinates (x y z; 1..dimension) can be listed in file,",
46 "See also: pxl2tac, mask2pxl, imgmask, imgmaxp, maskdila",
48 "Keywords: image, pixel, mask",
67int main(
int argc,
char **argv)
69 int ai, help=0, version=0, verbose=1;
70 int ret, fileNr=0, firstfile=0;
71 char maskfile[FILENAME_MAX], tempfile[FILENAME_MAX];
72 char *cptr, tmp[128], pxlfile[FILENAME_MAX];
79 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
80 maskfile[0]=tempfile[0]=pxlfile[0]=(char)0;
82 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
83 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
86 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
91 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
96 if(ai<argc) {
strlcpy(tempfile, argv[ai], FILENAME_MAX); ai++;}
97 if(ai<argc) {
strlcpy(maskfile, argv[ai], FILENAME_MAX); ai++;}
98 for(; ai<argc; ai++) {
99 if(firstfile==0) firstfile=ai;
104 if(!maskfile[0] || fileNr<1) {
105 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
111 printf(
"tempfile := %s\n", tempfile);
112 printf(
"maskfile := %s\n", maskfile);
113 printf(
"fileNr := %d\n", fileNr);
124 if(verbose>0) printf(
"reading %s\n", tempfile);
127 fprintf(stderr,
"Error: %s\n", timg.
statmsg);
128 if(verbose>1) printf(
"ret=%d\n", ret);
132 printf(
"pet_dimx := %d\n", timg.
dimx);
133 printf(
"pet_dimy := %d\n", timg.
dimy);
134 printf(
"pet_dimz := %d\n", timg.
dimz);
141 fprintf(stderr,
"Error: cannot allocate mask image.\n");
142 if(verbose>1) printf(
"ret=%d\n", ret);
151 if(verbose==1) printf(
"reading pixel positions\n");
154 for(ai=firstfile; ai<argc; ai++) {
155 strlcpy(pxlfile, argv[ai], FILENAME_MAX);
156 if(verbose>1) printf(
"reading %s\n", pxlfile);
158 if((ret=
pxlRead(&pxl, pxlfile, tmp))==0) {
160 }
else if(verbose>1) {
161 printf(
"could not read as pixel list: %s\n", tmp);
162 if(verbose>2) printf(
"ret := %d\n", ret);
167 if((ret=
vrdRead(pxlfile, &vol_range, tmp))==0) {
170 printf(
"vol_range.x := %d - %d\n", vol_range.
x1, vol_range.
x2);
171 printf(
"vol_range.y := %d - %d\n", vol_range.
y1, vol_range.
y2);
172 printf(
"vol_range.z := %d - %d\n", vol_range.
z1, vol_range.
z2);
177 fprintf(stderr,
"Warning: no pixels defined in %s\n", pxlfile);
180 fprintf(stderr,
"Error: out of memory.\n");
183 for(p.
z=vol_range.
z1; p.
z<=vol_range.
z2; p.
z++)
184 for(p.
x=vol_range.
x1; p.
x<=vol_range.
x2; p.
x++)
185 for(p.
y=vol_range.
y1; p.
y<=vol_range.
y2; p.
y++)
189 }
else if(verbose>1) {
190 printf(
"could not read as vrd file: %s\n", tmp);
191 if(verbose>2) printf(
"ret := %d\n", ret);
196 fprintf(stderr,
"Error: no pixels.\n");
200 printf(
"list of pixels:\n");
205 if(ret>0 && verbose>0) {
206 printf(
"%d pixel duplicates removed.\n", ret);
209 printf(
"list of pixels:\n");
215 for(
long long int i=0; i<pxl.
pxlNr; i++) {
216 if(pxl.
p[i].
z<1 || pxl.
p[i].
z>img.
dimz) {
217 fprintf(stderr,
"Error: pixel outside image z dimension.\n");
220 if(pxl.
p[i].
x<1 || pxl.
p[i].
x>img.
dimx) {
221 fprintf(stderr,
"Error: pixel outside image x dimension.\n");
224 if(pxl.
p[i].
y<1 || pxl.
p[i].
y>img.
dimy) {
225 fprintf(stderr,
"Error: pixel outside image x dimension.\n");
237 if(verbose>0) printf(
"setting mask contents\n");
238 for(
int zi=1; zi<img.
dimz; zi++)
239 for(
int yi=1; yi<img.
dimy; yi++)
240 for(
int xi=1; xi<img.
dimx; xi++)
241 img.
m[zi][yi][xi][0]=(
float)0.0;
242 for(
long long int i=0; i<pxl.
pxlNr; i++)
243 img.
m[pxl.
p[i].
z-1][pxl.
p[i].
y-1][pxl.
p[i].
x-1][0]=(
float)1.0;
249 if(verbose>1) fprintf(stdout,
"writing mask in %s\n", maskfile);
252 fprintf(stderr,
"Error: %s\n", img.
statmsg);
256 if(verbose>0) printf(
"mask written.\n\n");
int imgAllocateWithHeader(IMG *image, int planes, int rows, int columns, int frames, IMG *image_from)
void imgEmpty(IMG *image)
int imgRead(const char *fname, IMG *img)
int imgWrite(const char *fname, IMG *img)
Header file for libtpccurveio.
Header file for libtpcimgio.
void pxlFree(IMG_PIXELS *pxl)
int vrdReorder(VOL_RANGE *vol_range)
int pxlAllocateMore(IMG_PIXELS *pxl, long long int pxlNr)
int vrdVxlNr(VOL_RANGE *vol_range)
int pxlAdd(IMG_PIXELS *list, IMG_PIXEL *pxl)
int pxlWrite(IMG_PIXELS *pxl, FILE *fp, char *status)
int pxlRead(IMG_PIXELS *pxl, const char *fname, char *status)
long long int pxlRmDuplicates(IMG_PIXELS *list)
int vrdRead(char *vdffile, VOL_RANGE *vol_range, char *status)
void pxlInit(IMG_PIXELS *pxl)
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)
Header file for libtpcmodext.