LSSTApplications  11.0-13-gbb96280,12.1+18,12.1+7,12.1-1-g14f38d3+72,12.1-1-g16c0db7+5,12.1-1-g5961e7a+84,12.1-1-ge22e12b+23,12.1-11-g06625e2+4,12.1-11-g0d7f63b+4,12.1-19-gd507bfc,12.1-2-g7dda0ab+38,12.1-2-gc0bc6ab+81,12.1-21-g6ffe579+2,12.1-21-gbdb6c2a+4,12.1-24-g941c398+5,12.1-3-g57f6835+7,12.1-3-gf0736f3,12.1-37-g3ddd237,12.1-4-gf46015e+5,12.1-5-g06c326c+20,12.1-5-g648ee80+3,12.1-5-gc2189d7+4,12.1-6-ga608fc0+1,12.1-7-g3349e2a+5,12.1-7-gfd75620+9,12.1-9-g577b946+5,12.1-9-gc4df26a+10
LSSTDataManagementBasePackage
rotateImage.cc
Go to the documentation of this file.
1 /*
2  * LSST Data Management System
3  * Copyright 2008, 2009, 2010 LSST Corporation.
4  *
5  * This product includes software developed by the
6  * LSST Project (http://www.lsst.org/).
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the LSST License Statement and
19  * the GNU General Public License along with this program. If not,
20  * see <http://www.lsstcorp.org/LegalNotices/>.
21  */
22 
28 #include <cstdint>
29 
31 
32 namespace afwImage = lsst::afw::image;
33 namespace afwGeom = lsst::afw::geom;
34 
35 namespace lsst {
36 namespace afw {
37 namespace math {
38 
42 template<typename ImageT>
43 typename ImageT::Ptr rotateImageBy90(ImageT const& inImage,
44  int nQuarter
45  ) {
46  typename ImageT::Ptr outImage; // output image
47 
48  while (nQuarter < 0) {
49  nQuarter += 4;
50  }
51 
52  switch (nQuarter%4) {
53  case 0:
54  outImage.reset(new ImageT(inImage, true)); // a deep copy of inImage
55  break;
56  case 1:
57  outImage.reset(new ImageT(afwGeom::Extent2I(inImage.getHeight(), inImage.getWidth())));
58 
59  for (int y = 0; y != inImage.getHeight(); ++y) {
60  typename ImageT::y_iterator optr = outImage->col_begin(inImage.getHeight() - y - 1);
61  for (typename ImageT::x_iterator iptr = inImage.row_begin(y), end = inImage.row_end(y);
62  iptr != end; ++iptr, ++optr) {
63  *optr = *iptr;
64  }
65  }
66 
67  break;
68  case 2:
69  outImage.reset(new ImageT(inImage.getDimensions()));
70 
71  for (int y = 0; y != inImage.getHeight(); ++y) {
72  typename ImageT::x_iterator optr = outImage->x_at(inImage.getWidth() - 1,
73  inImage.getHeight() - y - 1);
74  for (typename ImageT::x_iterator iptr = inImage.row_begin(y), end = inImage.row_end(y);
75  iptr != end; ++iptr, optr -= 1) {
76  *optr = *iptr;
77  }
78  }
79  break;
80  case 3:
81  outImage.reset(new ImageT(afwGeom::Extent2I(inImage.getHeight(), inImage.getWidth())));
82 
83  for (int y = 0; y != inImage.getHeight(); ++y) {
84  typename ImageT::y_iterator optr = outImage->y_at(y, inImage.getWidth() - 1);
85  for (typename ImageT::x_iterator iptr = inImage.row_begin(y), end = inImage.row_end(y);
86  iptr != end; ++iptr, optr -= 1) {
87  *optr = *iptr;
88  }
89  }
90 
91  break;
92  }
93 
94  return outImage;
95 }
96 
100 template<typename ImageT>
101 PTR(ImageT) flipImage(ImageT const& inImage,
102  bool flipLR,
103  bool flipTB
104  ) {
105  typename ImageT::Ptr outImage(new ImageT(inImage, true)); // Output image
106 
107  if (flipLR) {
108  if (flipTB) {
109  for (int y = 0; y != inImage.getHeight(); ++y) {
110  typename ImageT::x_iterator optr = outImage->x_at(inImage.getWidth() - 1,
111  inImage.getHeight() - y - 1);
112  for (typename ImageT::x_iterator iptr = inImage.row_begin(y), end = inImage.row_end(y);
113  iptr != end; ++iptr, optr -= 1) {
114  *optr = *iptr;
115  }
116  }
117  } else {
118  for (int y = 0; y != inImage.getHeight(); ++y) {
119  typename ImageT::x_iterator optr = outImage->x_at(inImage.getWidth() - 1, y);
120  for (typename ImageT::x_iterator iptr = inImage.row_begin(y), end = inImage.row_end(y);
121  iptr != end; ++iptr, optr -= 1) {
122  *optr = *iptr;
123  }
124  }
125  }
126  } else {
127  if (flipTB) {
128  for (int y = 0; y != inImage.getHeight(); ++y) {
129  typename ImageT::x_iterator optr = outImage->row_begin(inImage.getHeight() - y - 1);
130  for (typename ImageT::x_iterator iptr = inImage.row_begin(y), end = inImage.row_end(y);
131  iptr != end; ++iptr, ++optr) {
132  *optr = *iptr;
133  }
134  }
135  } else {
136  ; // nothing to do
137  }
138  }
139 
140  return outImage;
141 }
142 
143 /************************************************************************************************************/
144 //
145 // Explicit instantiations
146 //
148 #define INSTANTIATE(TYPE) \
149  template afwImage::Image<TYPE>::Ptr rotateImageBy90(afwImage::Image<TYPE> const&, int); \
150  template afwImage::MaskedImage<TYPE>::Ptr rotateImageBy90(afwImage::MaskedImage<TYPE> const&, int); \
151  template afwImage::Image<TYPE>::Ptr flipImage(afwImage::Image<TYPE> const&, bool flipLR, bool flipTB); \
152  template afwImage::MaskedImage<TYPE>::Ptr flipImage(afwImage::MaskedImage<TYPE> const&, bool flipLR, bool flipTB);
153 
154 
155 INSTANTIATE(std::uint16_t)
156 INSTANTIATE(int)
157 INSTANTIATE(float)
158 INSTANTIATE(double)
159 template afwImage::Mask<std::uint16_t>::Ptr rotateImageBy90(afwImage::Mask<std::uint16_t> const&, int);
160 template afwImage::Mask<std::uint16_t>::Ptr flipImage(afwImage::Mask<std::uint16_t> const&, bool flipLR, bool flipTB);
162 
163 }}}
int y
boost::shared_ptr< ImageT > flipImage(ImageT const &inImage, bool flipLR, bool flipTB)
Flip an image left–right and/or top–bottom.
Definition: rotateImage.cc:101
#define INSTANTIATE(T)
table::Key< table::Array< Kernel::Pixel > > image
Definition: FixedKernel.cc:117
ImageT::Ptr rotateImageBy90(ImageT const &inImage, int nQuarter)
Rotate an image by an integral number of quarter turns.
Definition: rotateImage.cc:43
#define PTR(...)
Definition: base.h:41