Digital Signal Processing Reference
In-Depth Information
6
Filter
p
0
Abbildung 6.19
Berechnung des gewichteten Median-
filters. Jeder Bildwert wird, abhangig
vom entsprechenden Gewicht in der
Gewichtsmatrix
W
(
i, j
), mehrfach in
die zu sortierende Wertefolge einge-
setzt. Zum Beispiel wird der Wert (0)
des zentralen Pixels dreimal einge-
setzt (weil
W
(0
,
0) = 3), der Wert 7
zweimal. Anschließend wird innerhalb
der erweiterten Folge durch Sortie-
ren der Medianwert (2) ermittelt.
p
K
−
1
p
K
= gew. Median
p
K
+1
W
(
i, j
)
p
2
K
Im Unterschied zu linearen Filtern gibt es bei nichtlinearen Filtern
generell keine
”
starke“ Theorie, die etwa den Zusammenhang zwischen
der Addition von Bildern und dem Medianfilter in ahnlicher Form be-
schreiben wurde wie bei einer linearen Faltung (Gl. 6.19). Meistens sind
auch keine allgemeinen Aussagen uber die Auswirkungen nichtlinearer
Filter im Frequenzbereich moglich.
6.5 Implementierung von Filtern
6.5.1 E
zienz von Filterprogrammen
Die Berechnung von linearen Filtern ist in der Regel eine aufwendige An-
gelegenheit, speziell mit großen Bildern oder großen Filtern (im schlimm-
sten Fall beides). Fur ein Bild der Große
M
×
N
und einer Filtermatrix
der Große (2
K
+1)
×
(2
L
+1) benotigt eine direkte Implementierung
2
K ·
2
L · M · N
=4
KLMN
Operationen, d. h. Multiplikationen und Additionen. Wie wir in Abschn.
6.3.3 gesehen haben, sind substanzielle Einsparungen moglich, wenn Fil-
ter in kleinere, moglichst eindimensionale Filter separierbar sind.
Die Programmierbeispiele in diesem Kapitel wurden bewusst einfach
und verstandlich gehalten. Daher ist auch keine der bisher gezeigten
Losungen besonders e
zient und es bleiben zahlreiche Moglichkeiten
zur Verbesserung. Insbesondere ist es wichtig, alle dort nicht unbedingt
benotigten Anweisungen aus den Schleifenkernen herauszunehmen und
”
moglichst weit nach außen“ zu bringen. Speziell trifft das fur
”
teure“
Anweisungen wie Methodenaufrufe zu, die besonders in Java unverhalt-
nismaßig viel Rechenzeit verbrauchen konnen.
Wir haben mit den ImageJ-Methoden
getPixel()
und
putPixel()
in den Beispielen auch bewusst die einfachste Art des Zugriffs auf Bild-
elemente benutzt, aber eben auch die langsamste. Wesentlich schneller
ist der direkte Zugriff auf Pixel als Array-Elemente (s. Anhang 3.6).