Digital Signal Processing Reference
In-Depth Information
Dabei fuhren die Methoden
convolve1h(
p, h
)
und
convolve1v(
p, h
)
eindimensionale Filteroperationen in horizontaler bzw. vertikaler Rich-
tung durch (s. unten
”
Filtermethoden“). Nun werden die Komponenten
A
,
B
,
C
der Strukturmatrix berechnet und anschließend jeweils mit dem
separierbaren 2D-Filter
H
b
(
bfilt
)geglattet:
8.3
Implementierung
9
A = sqr ((FloatProcessor) Ix.duplicate());
10
B = sqr ((FloatProcessor) Iy.duplicate());
11
C = mult((FloatProcessor) Ix.duplicate(),Iy);
12
13
A = convolve2(A,bfilt);
// convolve with H
b
14
B = convolve2(B,bfilt);
15
C = convolve2(C,bfilt);
Die Variablen
A
,
B
,
C
vom Typ
FloatProcessor
sind dabei in der Klasse
HarrisCornerDet
deklariert. Die Methode
convolve2(
I , h
)
fuhrt eine
separierbare 2D-Faltung mit dem 1D Filterkern
h
auf das Bild
I
aus (s.
unten).
sqr()
und
mult()
sind Hilfsmethoden fur das Quadrat bzw. die
Quadratwurzel (Details in Anhang 4.1).
Die
corner response function
(Alg. 8.1, Zeile 7) wird schließlich durch
die Methode
makeCrf()
als neues Bild vom Typ
FloatProcessor
be-
rechnet:
16
void makeCrf() {
// defined in class HarrisCornerDet
17
int w = ipOrig.getWidth();
int h = ipOrig.getHeight();
18
Q = new FloatProcessor(w,h);
19
float[] Apix = (float[]) A.getPixels();
20
float[] Bpix = (float[]) B.getPixels();
21
float[] Cpix = (float[]) C.getPixels();
22
float[] Qpix = (float[]) Q.getPixels();
23
for (int v=0; v<h; v++) {
24
for (int u=0; u<w; u++) {
25
int i = v*w+u;
26
float a = Apix[i], b = Bpix[i], c = Cpix[i];
27
//
det(
M
)
float det = a*b-c*c;
28
//
trace(
M
)
float trace = a+b;
29
Qpix[i] = det - alpha * (trace * trace);
30
}
31
}
32
33
}
Filtermethoden
Die oben verwendeten Filtermethoden benutzen die ImageJ-Klasse
Con-
volver
(definiert in ij.plugin.filter.*) fur die eigentlichen Filteroperatio-
nen. Diese statischen Methoden sind in der Klasse
HarrisCornerDet
(Anhang 4.1) wie folgt definiert: