1 /**
2 * Copyright (c) 2011, The University of Southampton and the individual contributors.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * * Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 *
11 * * Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 *
15 * * Neither the name of the University of Southampton nor the names of its
16 * contributors may be used to endorse or promote products derived from this
17 * software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 package org.openimaj.image.processing.transform;
31
32 import org.openimaj.image.FImage;
33 import org.openimaj.image.analysis.algorithm.ImageInterpolation;
34 import org.openimaj.image.analysis.algorithm.ImageInterpolation.InterpolationType;
35 import org.openimaj.image.analysis.algorithm.ImageInterpolation.Interpolator;
36 import org.openimaj.image.processor.ImageProcessor;
37 import org.openimaj.image.processor.SinglebandImageProcessor;
38
39 /**
40 * {@link ImageProcessor} and associated static utility methods for transforming
41 * an image based on the pixel positions given by a distortion map:
42 * <code>destination(x,y) = source(mapx(x,y), mapy(x,y))</code>. This allows
43 * efficient implementation of highly non-linear mappings.
44 *
45 * @author Jonathon Hare (jsh2@ecs.soton.ac.uk)
46 */
47 public class RemapProcessor implements SinglebandImageProcessor<Float, FImage> {
48 ImageInterpolation interpolation;
49 FImage xords;
50 FImage yords;
51
52 /**
53 * Construct with the given distortion map, and use
54 * {@link InterpolationType#BILINEAR} interpolation.
55 *
56 * @param xords
57 * the x-ordinates
58 * @param yords
59 * the y-ordinates
60 */
61 public RemapProcessor(FImage xords, FImage yords) {
62 this(xords, yords, ImageInterpolation.InterpolationType.BILINEAR);
63 }
64
65 /**
66 * Construct with the given distortion map and interpolator.
67 *
68 * @param xords
69 * the x-ordinates
70 * @param yords
71 * the y-ordinates
72 * @param interpolator
73 * the interpolator
74 */
75 public RemapProcessor(FImage xords, FImage yords, Interpolator interpolator) {
76 this.interpolation = new ImageInterpolation(interpolator);
77 this.xords = xords;
78 this.yords = yords;
79 }
80
81 @Override
82 public void processImage(FImage image) {
83 final FImage out = remap(image, xords, yords, interpolation);
84 image.internalAssign(out);
85 }
86
87 /**
88 * Transform an image using the given parameters
89 *
90 * @param in
91 * the image to transform
92 * @param xords
93 * the x-ordinates
94 * @param yords
95 * the y-ordinates
96 * @param interpolator
97 * the interpolator
98 * @return the transformed image
99 */
100 public static FImage remap(FImage in, FImage xords, FImage yords, Interpolator interpolator) {
101 return remap(in, xords, yords, new ImageInterpolation(interpolator));
102 }
103
104 /**
105 * Transform an image using the given parameters
106 *
107 * @param in
108 * the image to transform
109 * @param xords
110 * the x-ordinates
111 * @param yords
112 * the y-ordinates
113 * @param interpolation
114 * the interpolation
115 * @return the transformed image
116 */
117 public static FImage remap(FImage in, FImage xords, FImage yords, ImageInterpolation interpolation) {
118 return remap(in, new FImage(xords.width, xords.height), xords, yords, interpolation);
119 }
120
121 /**
122 * Transform an image using the given parameters, and write te results into
123 * <code>out</code>
124 *
125 * @param in
126 * the image to transform
127 * @param out
128 * the output image
129 * @param xords
130 * the x-ordinates
131 * @param yords
132 * the y-ordinates
133 * @param interpolation
134 * the interpolation
135 * @return out
136 */
137 public static FImage remap(FImage in, FImage out, FImage xords, FImage yords, ImageInterpolation interpolation) {
138 final int width = Math.min(xords.width, out.width);
139 final int height = Math.min(xords.height, out.height);
140
141 interpolation.analyseImage(in);
142
143 for (int y = 0; y < height; y++) {
144 for (int x = 0; x < width; x++) {
145 out.pixels[y][x] = interpolation.getPixelInterpolated(xords.pixels[y][x], yords.pixels[y][x]);
146 }
147 }
148 return out;
149 }
150
151 /**
152 * Transform an image using the given parameters. Assume
153 * {@link InterpolationType#BILINEAR} interpolation.
154 *
155 * @param in
156 * the image to transform
157 * @param xords
158 * the x-ordinates
159 * @param yords
160 * the y-ordinates
161 * @return the transformed image
162 */
163 public static FImage remap(FImage in, FImage xords, FImage yords) {
164 return remap(in, xords, yords, new ImageInterpolation(ImageInterpolation.InterpolationType.BILINEAR));
165 }
166
167 /**
168 * Transform an image using the given parameters, and write the results into
169 * <code>out</code>. Assume {@link InterpolationType#BILINEAR}
170 * interpolation.
171 *
172 * @param in
173 * the image to transform
174 * @param out
175 * the output image
176 * @param xords
177 * the x-ordinates
178 * @param yords
179 * the y-ordinates
180 * @return out
181 */
182 public static FImage remap(FImage in, FImage out, FImage xords, FImage yords) {
183 return remap(in, out, xords, yords, new ImageInterpolation(ImageInterpolation.InterpolationType.BILINEAR));
184 }
185 }