source: tags/release-1.1.5/src/Cubes/trimImage.cc @ 1441

Last change on this file since 1441 was 393, checked in by MatthewWhiting, 17 years ago

Fixed up headers for trunk as well.

File size: 9.5 KB
Line 
1// -----------------------------------------------------------------------
2// trimImage.cc: Trim a Cube of BLANKs around the spatial edge.
3// -----------------------------------------------------------------------
4// Copyright (C) 2006, Matthew Whiting, ATNF
5//
6// This program is free software; you can redistribute it and/or modify it
7// under the terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 2 of the License, or (at your
9// option) any later version.
10//
11// Duchamp is distributed in the hope that it will be useful, but WITHOUT
12// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14// for more details.
15//
16// You should have received a copy of the GNU General Public License
17// along with Duchamp; if not, write to the Free Software Foundation,
18// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
19//
20// Correspondence concerning Duchamp may be directed to:
21//    Internet email: Matthew.Whiting [at] atnf.csiro.au
22//    Postal address: Dr. Matthew Whiting
23//                    Australia Telescope National Facility, CSIRO
24//                    PO Box 76
25//                    Epping NSW 1710
26//                    AUSTRALIA
27// -----------------------------------------------------------------------
28#include <iostream>
29#include <duchamp/param.hh>
30#include <duchamp/Cubes/cubes.hh>
31#include <duchamp/PixelMap/Object3D.hh>
32
33using namespace PixelInfo;
34
35namespace duchamp
36{
37
38  void Cube::trimCube()
39  {
40    /**
41     *  If the blankPix flag has been set, this routine trims excess blank
42     *    pixels from the edges of the spatial image.
43     *   It uses as its template the first channel, assuming that its non-BLANK
44     *    size is representative of the rest of the channels.
45     *   The edges are moved in until the first non-BLANK pixel is encountered.
46     *   All other arrays are similarly edited, and the amount of trimming is
47     *    recorded.
48     */
49
50    //   if(this->par.getFlagBlankPix()) {
51    if(this->par.getFlagTrim()) {
52
53      long xdim = this->axisDim[0];
54      long ydim = this->axisDim[1];
55      long zdim = this->axisDim[2];
56      const long ZCHAN = 0;
57
58      int left,right,top,bottom;
59
60      for(int z = 0; z < zdim; z++){
61
62        for(int row=0;row<ydim;row++){
63          left=0;
64          right=0;
65          while((left<xdim)&&
66                (this->par.isBlank(this->array[row*xdim+left+ZCHAN*xdim*ydim])) ) {
67            left++;
68          }
69          while((right<xdim)&&
70                (this->par.isBlank(this->array[row*xdim+(xdim-1-right)+ZCHAN*xdim*ydim]))){
71            right++;
72          }
73
74          if( ((z==0)&&(row==0)) || (left < this->par.getBorderLeft()) )
75            this->par.setBorderLeft(left);
76          if( ((z==0)&&(row==0)) || (right < this->par.getBorderRight()) )
77            this->par.setBorderRight(right);
78
79        }
80   
81        for(int col=0;col<xdim;col++){
82          bottom=0;
83          top=0;
84          while((bottom<ydim)&&
85                (this->par.isBlank(this->array[col+bottom*xdim+ZCHAN*xdim*ydim])) ) bottom++;
86
87          while((top<ydim)&&
88                (this->par.isBlank(this->array[col+(ydim-1-top)*xdim+ZCHAN*xdim*ydim])) ) top++;
89
90          if( ((z==0)&&(col==0)) || (bottom < this->par.getBorderBottom()) )
91            this->par.setBorderBottom(bottom);
92          if( ((z==0)&&(col==0)) || (top < this->par.getBorderTop()) )
93            this->par.setBorderTop(top);
94
95        }
96
97      }
98   
99      left = this->par.getBorderLeft();
100      right = this->par.getBorderRight();
101      top = this->par.getBorderTop();
102      bottom = this->par.getBorderBottom();
103
104      this->axisDim[0] = xdim - left - right;
105      this->axisDim[1] = ydim - bottom - top;
106      this->axisDim[2] = zdim;
107      this->numPixels = this->axisDim[0]*this->axisDim[1]*this->axisDim[2];
108
109      long oldpos,newpos;
110   
111      // Do the trimming, but only if we need to -- is there a border of Blanks?
112      if((left>0)||(right>0)||(bottom>0)||(top>0)) {
113
114        // Trim the array of pixel values
115        float *newarray  = new float[this->numPixels];
116        for(int x = 0; x < axisDim[0]; x++){
117          for(int y = 0; y < axisDim[1]; y++){
118            for(int z = 0; z < axisDim[2]; z++){
119              oldpos = (x+left) + (y+bottom)*xdim + z*xdim*ydim;
120              newpos = x + y*this->axisDim[0] +
121                z*this->axisDim[0]*this->axisDim[1];
122              newarray[newpos]  = this->array[oldpos];
123            }
124          }
125        }
126        delete [] this->array;
127        this->array = newarray;
128
129        // Trim the array of baseline values
130        if(this->par.getFlagBaseline()){
131          float *newarray  = new float[this->numPixels];
132          for(int x = 0; x < axisDim[0]; x++){
133            for(int y = 0; y < axisDim[1]; y++){
134              for(int z = 0; z < axisDim[2]; z++){
135                oldpos = (x+left) + (y+bottom)*xdim + z*xdim*ydim;
136                newpos = x + y*this->axisDim[0] +
137                  z*this->axisDim[0]*this->axisDim[1];
138                newarray[newpos]  = this->baseline[oldpos];
139              }
140            }
141          }
142          delete [] this->baseline;
143          this->baseline = newarray;
144        }
145
146        // Trim the 2-D detection map
147        short *newdetect = new short[this->axisDim[0]*this->axisDim[1]];
148        for(int x = 0; x < axisDim[0]; x++){
149          for(int y = 0; y < axisDim[1]; y++){
150            oldpos = (x+left) + (y+bottom)*xdim;
151            newpos = x + y*this->axisDim[0];
152            newdetect[newpos] = this->detectMap[oldpos];
153          }
154        }
155        delete [] this->detectMap;
156        this->detectMap = newdetect;
157
158        if(this->par.getFlagATrous() || this->par.getFlagSmooth()){
159          // Trim the reconstructed array if we are going to do the
160          // reconstruction or smooth the array
161          float *newrecon  = new float[this->numPixels];
162          for(int x = 0; x < axisDim[0]; x++){
163            for(int y = 0; y < axisDim[1]; y++){
164              for(int z = 0; z < axisDim[2]; z++){
165                oldpos = (x+left) + (y+bottom)*xdim + z*xdim*ydim;
166                newpos = x + y*this->axisDim[0] +
167                  z*this->axisDim[0]*this->axisDim[1];
168                newrecon[newpos] = this->recon[oldpos];   
169              }
170            }
171          }
172          delete [] this->recon;
173          this->recon = newrecon;
174        }
175
176        // Set the flag indicating trimming has taken place only if it has.
177        this->par.setFlagCubeTrimmed(true);
178
179      }
180
181    }
182
183  }
184
185
186  void Cube::unTrimCube()
187  {
188    /**
189     *  If the cube has been trimmed by trimCube(), this task adds back the
190     *   BLANK pixels on the edges, so that it returns to its original size.
191     *   All arrays are similarly edited.
192     */
193
194    if(this->par.getFlagCubeTrimmed()){
195
196      long left = this->par.getBorderLeft();
197      long right = this->par.getBorderRight();
198      long top = this->par.getBorderTop();
199      long bottom = this->par.getBorderBottom();
200
201      long smallXDim = this->axisDim[0];
202      long smallYDim = this->axisDim[1];
203      long smallZDim = this->axisDim[2];
204
205      // first correct the dimension sizes
206      this->axisDim[0] = smallXDim + left + right;
207      this->axisDim[1] = smallYDim + bottom + top;
208      this->axisDim[2] = smallZDim;
209      this->numPixels = this->axisDim[0]*this->axisDim[1]*this->axisDim[2];
210
211      long pos,smlpos;
212      bool isDud;
213
214      // Correct the array of pixel values
215      float *newarray  = new float[this->numPixels];
216      for(int x = 0; x < this->axisDim[0]; x++){
217        for(int y = 0; y < this->axisDim[1]; y++){
218          isDud = (x<left) || (x>=smallXDim+left) ||
219            (y<bottom) || (y>=smallYDim+bottom);
220       
221          for(int z = 0; z < this->axisDim[2]; z++){
222            pos = x + y*this->axisDim[0] + z*this->axisDim[0]*this->axisDim[1];
223            smlpos = (x-left) + (y-bottom)*smallXDim + z * smallXDim * smallYDim;
224            if(isDud) newarray[pos] = this->par.getBlankPixVal();
225            else      newarray[pos] = this->array[smlpos];
226          }
227        }
228      }
229      delete [] this->array;
230      this->array = newarray;
231
232      if(this->reconExists){
233        // Correct the reconstructed/smoothed array
234        float *newrecon   = new float[this->numPixels];
235        for(int x = 0; x < this->axisDim[0]; x++){
236          for(int y = 0; y < this->axisDim[1]; y++){
237            isDud = (x<left) || (x>=smallXDim+left) ||
238              (y<bottom) || (y>=smallYDim+bottom);
239         
240            for(int z = 0; z < this->axisDim[2]; z++){
241              pos = x + y*this->axisDim[0] + z*this->axisDim[0]*this->axisDim[1];
242              smlpos = (x-left) + (y-bottom)*smallXDim
243                + z * smallXDim * smallYDim;
244              if(isDud) newrecon[pos] = this->par.getBlankPixVal();
245              else      newrecon[pos] = this->recon[smlpos];
246            }
247          }
248        }
249        delete [] this->recon;
250        this->recon = newrecon;
251      }
252
253      // Correct the array of baseline values
254      if(this->par.getFlagBaseline()){
255        float *newbase  = new float[this->numPixels];
256        for(int x = 0; x < this->axisDim[0]; x++){
257          for(int y = 0; y < this->axisDim[1]; y++){
258            isDud = (x<left) || (x>=smallXDim+left) ||
259              (y<bottom) || (y>=smallYDim+bottom);
260       
261            for(int z = 0; z < this->axisDim[2]; z++){
262              pos = x + y*this->axisDim[0] + z*this->axisDim[0]*this->axisDim[1];
263              smlpos = (x-left) + (y-bottom)*smallXDim + z*smallXDim*smallYDim;
264              if(isDud) newbase[pos] = this->par.getBlankPixVal();
265              else      newbase[pos] = this->baseline[smlpos];
266            }
267          }
268        }
269        delete [] this->baseline;
270        this->baseline = newbase;
271      }
272
273      // Correct the 2-D detection map
274      short *newdetect = new short[this->axisDim[0]*this->axisDim[1]];
275      for(int x = 0; x < this->axisDim[0]; x++){
276        for(int y = 0; y < this->axisDim[1]; y++){
277          pos = x + y*this->axisDim[0];
278          smlpos = (x-left) + (y-bottom)*smallXDim;
279          isDud = (x<left) || (x>=smallXDim+left) ||
280            (y<bottom) || (y>=smallYDim+bottom);
281          if(isDud) newdetect[pos]=0;
282          else newdetect[pos] = this->detectMap[smlpos];
283        }
284      }
285      delete [] this->detectMap;
286      this->detectMap = newdetect;   
287
288 
289      // Now update the positions for all the detections
290 
291      for(int i=0;i<this->objectList->size();i++){
292        this->objectList->at(i).pixels().addOffsets(left,bottom,0);
293        //      objectList[i].calcParams(this->array,this->axisDim);
294      }
295
296    }
297
298  }
299
300}
Note: See TracBrowser for help on using the repository browser.