8#include "tpcclibConfig.h"
23static char *info[] = {
24 "Move specified image frames in x,y-directions. Only for simulation use:",
25 "this is not convenient nor valid method for movement correction, because",
26 "attenuation correction is not moved accordingly.",
28 "Usage: @P [Options] imgfile x y [frames [outputfile]]",
30 "Image file can be in ECAT 6.3 or 7.x, NIfTI-1, or Analyze 7.5 format.",
31 "Movements in x and y directions are given in pixels, with positive number",
32 "meaning right/up and negative number meaning left/down.",
33 "If name for output file is not given, then the original image is overwritten.",
34 "If also frame(s) are not given, then all frames are moved.",
38 " New image area is filled with neighbouring pixel values",
39 " (by default with zeroes).",
42 "Example: Move pixels in frames 14-16 upwards by two pixels",
43 " @P ua2918dy1.v 0 2 14-16 ua2918dy1mov.v",
45 "See also: imgadd, simcirc, simboxes, flat2img",
47 "Keywords: image, simulation, software testing, mask",
66int main(
int argc,
char **argv)
68 int ai, help=0, version=0, verbose=1;
71 char imgfile[FILENAME_MAX], outfile[FILENAME_MAX];
78 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
79 imgfile[0]=outfile[0]=(char)0;
82 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
83 char *cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
85 if(strncasecmp(cptr,
"FILL", 3)==0) {
86 fill_area=1;
continue;
88 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
93 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
98 if(ai<argc) {
strlcpy(imgfile, argv[ai], FILENAME_MAX); ai++;}
100 if(
atoi_with_check(argv[ai++], &xmov)) {fprintf(stderr,
"Error: invalid x.");
return(1);}
103 if(
atoi_with_check(argv[ai++], &ymov)) {fprintf(stderr,
"Error: invalid y.");
return(1);}
105 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
109 if(verbose>3) printf(
"requested_frames: '%s'\n", argv[ai]);
111 fprintf(stderr,
"Error: invalid frame definition.\n");
116 if(ai<argc) {
strlcpy(outfile, argv[ai], FILENAME_MAX); ai++;}
117 if(ai<argc) {fprintf(stderr,
"Error: too many arguments.\n");
return(1);}
121 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
124 if(xmov==0 && ymov==0) {fprintf(stderr,
"Error: no movement was required.\n");
return(1);}
125 if(!outfile[0]) strcpy(outfile, imgfile);
130 printf(
"imgfile := %s\n", imgfile);
131 printf(
"outfile := %s\n", outfile);
132 printf(
"fill := %d\n", fill_area);
133 printf(
"x := %d\n", xmov);
134 printf(
"y := %d\n", ymov);
136 printf(
"frames := %d", framelist.
list[0]);
137 for(
int li=1; li<framelist.
nr; li++) printf(
", %d", framelist.
list[li]);
146 if(verbose>0) printf(
"reading %s\n", imgfile);
150 fprintf(stderr,
"Error: %s\n", img.
statmsg);
151 if(verbose>1) printf(
"ret := %d\n", ret);
156 fprintf(stderr,
"Error: %s is not an image.\n", imgfile);
160 printf(
"dimt := %d\n", img.
dimt);
161 printf(
"dimx := %d\n", img.
dimx);
162 printf(
"dimy := %d\n", img.
dimy);
163 printf(
"dimz := %d\n", img.
dimz);
166 if(abs(xmov)>=img.
dimx || abs(ymov)>=img.
dimy) {
167 fprintf(stderr,
"Error: cannot move outsize image matrix.\n");
173 for(
int li=0; li<framelist.
nr; li++)
174 if(framelist.
list[li]>0 && framelist.
list[li]<=img.
dimt) movNr++;
176 fprintf(stderr,
"Error: image does not contain specified frames.\n");
179 if(verbose>1 && movNr!=framelist.
nr) printf(
"%d frame(s) will be moved.\n", movNr);
184 if(framelist.
nr==0) {
187 printf(
"frames := %d", framelist.
list[0]);
188 for(
int li=1; li<framelist.
nr; li++) printf(
", %d", framelist.
list[li]);
197 if(verbose>0) printf(
"processing...\n");
200 for(
int li=0, movNr=0; li<framelist.
nr; li++) {
201 fi=framelist.
list[li]-1;
if(fi<0 || fi>=img.
dimt)
continue;
202 if(verbose>2) printf(
" moving pixels on frame %d\n", fi+1);
205 for(yi=-ymov; yi<img.
dimy; yi++) {
206 if(verbose>8) printf(
"y: [%d] -> [%d]\n", yi, yi+ymov);
207 for(zi=0; zi<img.
dimz; zi++)
for(xi=0; xi<img.
dimx; xi++)
208 img.
m[zi][yi+ymov][xi][fi]=img.
m[zi][yi][xi][fi];
210 for(yi=img.
dimy+ymov; yi<img.
dimy; yi++) {
211 if(verbose>8) printf(
"y: [%d]=0\n", yi);
212 for(zi=0; zi<img.
dimz; zi++)
for(xi=0; xi<img.
dimx; xi++)
213 if(fill_area && yi>0)
214 img.
m[zi][yi][xi][fi]=img.
m[zi][yi-1][xi][fi];
216 img.
m[zi][yi][xi][fi]=0.0;
219 for(yi=img.
dimy-ymov-1; yi>=0; yi--) {
220 if(verbose>8) printf(
"y: [%d] -> [%d]\n", yi, yi+ymov);
221 for(zi=0; zi<img.
dimz; zi++)
for(xi=0; xi<img.
dimx; xi++)
222 img.
m[zi][yi+ymov][xi][fi]=img.
m[zi][yi][xi][fi];
224 for(yi=ymov-1; yi>=0; yi--) {
225 if(verbose>8) printf(
"y: [%d]=0\n", yi);
226 for(zi=0; zi<img.
dimz; zi++)
for(xi=0; xi<img.
dimx; xi++)
227 if(fill_area && yi<img.
dimy-1)
228 img.
m[zi][yi][xi][fi]=img.
m[zi][yi+1][xi][fi];
230 img.
m[zi][yi][xi][fi]=0.0;
235 for(xi=-xmov; xi<img.
dimx; xi++) {
236 if(verbose>8) printf(
"x: [%d] -> [%d]\n", xi, xi+xmov);
237 for(zi=0; zi<img.
dimz; zi++)
for(yi=0; yi<img.
dimy; yi++)
238 img.
m[zi][yi][xi+xmov][fi]=img.
m[zi][yi][xi][fi];
240 for(xi=img.
dimx+xmov; xi<img.
dimx; xi++) {
241 if(verbose>8) printf(
"x: [%d]=0\n", xi);
242 for(zi=0; zi<img.
dimz; zi++)
for(yi=0; yi<img.
dimy; yi++)
243 if(fill_area && xi>0)
244 img.
m[zi][yi][xi][fi]=img.
m[zi][yi][xi-1][fi];
246 img.
m[zi][yi][xi][fi]=0.0;
249 for(xi=img.
dimx-xmov-1; xi>=0; xi--) {
250 if(verbose>8) printf(
"x: [%d] -> [%d]\n", xi, xi+xmov);
251 for(zi=0; zi<img.
dimz; zi++)
for(yi=0; yi<img.
dimy; yi++)
252 img.
m[zi][yi][xi+xmov][fi]=img.
m[zi][yi][xi][fi];
254 for(xi=xmov-1; xi>=0; xi--) {
255 if(verbose>8) printf(
"x: [%d]=0\n", xi);
256 for(zi=0; zi<img.
dimz; zi++)
for(yi=0; yi<img.
dimy; yi++)
257 if(fill_area && xi<img.
dimx-1)
258 img.
m[zi][yi][xi][fi]=img.
m[zi][yi][xi+1][fi];
260 img.
m[zi][yi][xi][fi]=0.0;
266 if(verbose>1) printf(
"%d moved frames.\n", movNr);
272 if(verbose>0) printf(
"writing image %s\n", outfile);
275 fprintf(stderr,
"Error: %s\n", img.
statmsg);
279 if(verbose>0) printf(
"done.\n\n");
int atoi_with_check(const char *int_as_string, int *result_value)
void imgEmpty(IMG *image)
int imgRead(const char *fname, IMG *img)
int imgWrite(const char *fname, IMG *img)
int integerListEmpty(INTEGER_LIST *l)
int integerListInit(INTEGER_LIST *l)
int integerListSort(INTEGER_LIST *l)
int integerListExpandFromString(const char *s1, const char *s2, INTEGER_LIST *l, const int ifnew)
int integerListAdd(INTEGER_LIST *l, int v, int ifnew)
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)