lsst.afw
g3a5ebb7d8a+28b83bf6a5
Toggle main menu visibility
Loading...
Searching...
No Matches
src
math
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
23
/*
24
* Rotate an Image (or Mask or MaskedImage) by a fixed angle or number of quarter turns
25
*/
26
#include <memory>
27
#include <cstdint>
28
29
#include "
lsst/geom.h
"
30
#include "
lsst/afw/math/offsetImage.h
"
31
32
namespace
afwImage
=
lsst::afw::image
;
33
34
namespace
lsst
{
35
namespace
afw
{
36
namespace
math
{
37
38
template
<
typename
ImageT>
39
std::shared_ptr<ImageT>
rotateImageBy90
(ImageT
const
& inImage,
int
nQuarter) {
40
std::shared_ptr<ImageT>
outImage;
// output image
41
42
while
(nQuarter < 0) {
43
nQuarter += 4;
44
}
45
46
switch
(nQuarter % 4) {
47
case
0:
48
outImage.
reset
(
new
ImageT(inImage,
true
));
// a deep copy of inImage
49
break
;
50
case
1:
51
outImage.
reset
(
new
ImageT(
lsst::geom::Extent2I
(inImage.getHeight(), inImage.getWidth())));
52
53
for
(
int
y = 0; y != inImage.getHeight(); ++y) {
54
typename
ImageT::y_iterator optr = outImage->col_begin(inImage.getHeight() - y - 1);
55
for
(
typename
ImageT::x_iterator iptr = inImage.row_begin(y), end = inImage.row_end(y);
56
iptr != end; ++iptr, ++optr) {
57
*optr = *iptr;
58
}
59
}
60
61
break
;
62
case
2:
63
outImage.
reset
(
new
ImageT(inImage.getDimensions()));
64
65
for
(
int
y = 0; y != inImage.getHeight(); ++y) {
66
typename
ImageT::x_iterator optr =
67
outImage->x_at(inImage.getWidth() - 1, inImage.getHeight() - y - 1);
68
for
(
typename
ImageT::x_iterator iptr = inImage.row_begin(y), end = inImage.row_end(y);
69
iptr != end; ++iptr, optr -= 1) {
70
*optr = *iptr;
71
}
72
}
73
break
;
74
case
3:
75
outImage.
reset
(
new
ImageT(
lsst::geom::Extent2I
(inImage.getHeight(), inImage.getWidth())));
76
77
for
(
int
y = 0; y != inImage.getHeight(); ++y) {
78
typename
ImageT::y_iterator optr = outImage->y_at(y, inImage.getWidth() - 1);
79
for
(
typename
ImageT::x_iterator iptr = inImage.row_begin(y), end = inImage.row_end(y);
80
iptr != end; ++iptr, optr -= 1) {
81
*optr = *iptr;
82
}
83
}
84
85
break
;
86
}
87
88
return
outImage;
89
}
90
91
template
<
typename
ImageT>
92
std::shared_ptr<ImageT>
flipImage
(ImageT
const
& inImage,
bool
flipLR,
bool
flipTB) {
93
std::shared_ptr<ImageT>
outImage(
new
ImageT(inImage,
true
));
// Output image
94
95
if
(flipLR) {
96
if
(flipTB) {
97
for
(
int
y = 0; y != inImage.getHeight(); ++y) {
98
typename
ImageT::x_iterator optr =
99
outImage->x_at(inImage.getWidth() - 1, inImage.getHeight() - y - 1);
100
for
(
typename
ImageT::x_iterator iptr = inImage.row_begin(y), end = inImage.row_end(y);
101
iptr != end; ++iptr, optr -= 1) {
102
*optr = *iptr;
103
}
104
}
105
}
else
{
106
for
(
int
y = 0; y != inImage.getHeight(); ++y) {
107
typename
ImageT::x_iterator optr = outImage->x_at(inImage.getWidth() - 1, y);
108
for
(
typename
ImageT::x_iterator iptr = inImage.row_begin(y), end = inImage.row_end(y);
109
iptr != end; ++iptr, optr -= 1) {
110
*optr = *iptr;
111
}
112
}
113
}
114
}
else
{
115
if
(flipTB) {
116
for
(
int
y = 0; y != inImage.getHeight(); ++y) {
117
typename
ImageT::x_iterator optr = outImage->row_begin(inImage.getHeight() - y - 1);
118
for
(
typename
ImageT::x_iterator iptr = inImage.row_begin(y), end = inImage.row_end(y);
119
iptr != end; ++iptr, ++optr) {
120
*optr = *iptr;
121
}
122
}
123
}
else
{
124
;
// nothing to do
125
}
126
}
127
128
return
outImage;
129
}
130
131
//
132
// Explicit instantiations
133
//
135
#define INSTANTIATE(TYPE) \
136
template std::shared_ptr<afwImage::Image<TYPE>> rotateImageBy90(afwImage::Image<TYPE> const&, int); \
137
template std::shared_ptr<afwImage::MaskedImage<TYPE>> rotateImageBy90( \
138
afwImage::MaskedImage<TYPE> const&, int); \
139
template std::shared_ptr<afwImage::Image<TYPE>> flipImage(afwImage::Image<TYPE> const&, bool flipLR, \
140
bool flipTB); \
141
template std::shared_ptr<afwImage::MaskedImage<TYPE>> flipImage(afwImage::MaskedImage<TYPE> const&, \
142
bool flipLR, bool flipTB);
143
144
INSTANTIATE
(
std::uint16_t
)
145
INSTANTIATE
(
int
)
146
INSTANTIATE
(
float
)
147
INSTANTIATE
(
double
)
148
template
std::shared_ptr<afwImage::Mask<afwImage::MaskPixel>
>
rotateImageBy90
(
149
afwImage::Mask<afwImage::MaskPixel>
const
&,
int
);
150
template
std::shared_ptr<afwImage::Mask<afwImage::MaskPixel>
>
flipImage
(
151
afwImage::Mask<afwImage::MaskPixel>
const
&,
bool
flipLR,
bool
flipTB);
153
}
// namespace math
154
}
// namespace afw
155
}
// namespace lsst
INSTANTIATE
#define INSTANTIATE(FROMSYS, TOSYS)
Definition
Detector.cc:509
lsst::afw::image::Mask
Represent a 2-dimensional array of bitmask pixels.
Definition
Mask.h:82
geom.h
std::uint16_t
lsst::afw::image
Definition
imageAlgorithm.dox:1
lsst::afw::math
Definition
statistics.dox:6
lsst::afw::math::rotateImageBy90
std::shared_ptr< ImageT > rotateImageBy90(ImageT const &image, int nQuarter)
Rotate an image by an integral number of quarter turns.
Definition
rotateImage.cc:39
lsst::afw::math::flipImage
std::shared_ptr< ImageT > flipImage(ImageT const &inImage, bool flipLR, bool flipTB)
Flip an image left–right and/or top–bottom.
Definition
rotateImage.cc:92
lsst::afw
Definition
imageAlgorithm.dox:1
lsst::geom::Extent2I
Extent< int, 2 > Extent2I
lsst
offsetImage.h
std::shared_ptr::reset
T reset(T... args)
std::shared_ptr
Generated on
for lsst.afw by
1.17.0