Digital Signal Processing Reference
In-Depth Information
Mapping
(Klasse)
16.4
Java-Implementierung
Die abstrakte Klasse
Mapping
ist die Uberklasse fur alle nachfolgenden
Abbildungsklassen. Sie schreibt die Methode
applyTo(Pnt2d pnt)
vor,
womit die geometrische Abbildung auf den Koordinatenpunkt
pnt
an-
gewandt wird und deren konkrete Implementierung durch jede der Sub-
klassen (Abbildungen) erfolgt.
Demgegenuber ist die Methode
applyTo (ImageProcessor ip,
PixelInterpolator intPol)
in der Klasse
Mapping
selbst implemen-
tiert (Zeile 21) und fur alle Abbildungen gleich. Durch sie wird diese
Koordinatentransformation auf ein ganzes Bild angewandt, wobei das
Objekt
intPol
fur die Interpolation der Pixelwerte sorgt (Zeile 38).
Die eigentliche Bildtransformation arbeitet nach dem
Target-to-
Source
-Verfahren und benotigt dazu die inverse Koordinatentransforma-
tion
T
−
1
, die durch die Methode
getInverse()
erzeugt wird (Zeile 14,
25). Falls die Abbildung keine Ruckwartsabbildung ist (
isInverse ==
false
), wird die Abbildung invertiert. Diese Inversion ist nur fur lineare
Abbildungen (Klasse
LinearMapping
und deren Subklassen) implemen-
tiert, bei den anderen Abbildungsklassen wird bereits zu Beginn eine
Ruckwartstransformation erzeugt.
1
import ij.process.ImageProcessor;
2
3
public abstract class Mapping implements Cloneable {
4
boolean isInverse = false;
5
6
// subclasses must implement this method:
abstract Pnt2d applyTo(Pnt2d pnt);
7
8
9
Mapping invert() {
throw new
10
IllegalArgumentException("cannot invert mapping");
11
}
12
13
14
Mapping getInverse() {
if (isInverse)
15
return this;
16
else
17
return this.invert();
// only linear mappings invert
18
}
19
20
21
void applyTo(ImageProcessor ip, PixelInterpolator intPol){
ImageProcessor targetIp = ip;
22
ImageProcessor sourceIp = ip.duplicate();
23
24
25
Mapping invMap = this.getInverse();
// get inverse mapping
intPol.setImageProcessor(sourceIp);
26
27
28
int w = sourceIp.getWidth();
int h = sourceIp.getHeight();
29