Filter sind ein fester Bestandteil von fast jeder Aufgabe der
Bildverarbeitung. Sie können beispielsweise zum Glätten von
Bildern (z.B. mit
), zum Extrahieren subpixelgenauer Kanten
(z.B. mit mean_image
), oder zur Verarbeitung des Frequenzraums
eines Bildes (z.B. mit edges_sub_pix
) verwendet werden.
fft_image
Filteroperationen werden meist unter Verwendung einer Filtermaske durchgeführt, welche pixelweise über das Bild bewegt wird. Für jedes Pixel wird ein neuer Wert basierend auf dessen Nachbarschaft berechnet. Die Nachbarschaft wird durch Form und Größe der Filtermaske bestimmt (siehe Schema unten).
(1) | (2) | (3) | (4) |
Wie anhand des Funktionsprinzips von Filtermasken zu erkennen ist, muss auf die Behandlung von Pixeln an Bild- oder Domänenrändern besonders geachtet werden, da Teile der Filtermaske über die Domäne hinausragen. Einige damit verbundene Aspekte werden nachfolgend betrachtet.
Wenn ein Filter, der eine Maske nutzt, auf ein Bild mit reduzierter Domäne angewendet wird, ist das Ergebnis an den Grenzen der Domäne eventuell überraschend. Das kommt daher, dass Grauwerte, die eigentlich außerhalb der Domäne liegen, auch als Input für den Filter benutzt werden (siehe Schema unten).
(1) | (2) | (3) | (4) |
Um dies besser zu verstehen, muss die Definition der Domäne in diesem speziellen Fall genauer betrachtet werden: Für einen Filter definiert die Domäne, für welche Eingabepixel Ausgabepixel berechnet werden müssen. Dennoch können auch Pixel außerhalb der Domäne (die innerhalb der Bildmatrix liegen) für die Berechnung berücksichtigt werden.
Ein weiterer Aspekt, den es zu beachten gilt ist die Behandlung von Pixeln
außerhalb der Domäne des Eingabebildes.
Der Parameter 'init_new_image'
des Operators
bestimmt, wie diese Pixel behandelt werden. Werden die Pixel mit 0
initialisiert, dann führt systemunabhängig jede Programmausführung immer
zum gleichen Ergebnis. Andernfalls bleiben die Pixel undefiniert.
Während die Laufzeit dadurch verbessert wird, können
undefinierte Pixel von System zu System unterschiedlich sein,
zum Beispiel abhängig davon, ob Parallelisierung aktiv ist oder nicht.
Es wird lediglich garantiert, dass sie auf identischen Systemen bei
wiederholter Programmausführung konsistent sind. In bestimmten Fällen
können diese 'undefinierten' Pixel zu Problemen führen. Das Vergrößern
des resultierenden Bildes auf die komplette Domäne mit set_system
führt zu Artefakten außerhalb der ursprünglichen Domäne.
full_domain
Werden zwei oder mehr Filter nacheinander angewendet, verstärkt sich die Auswirkung von undefinierten oder unerwarteten Pixelwerten (siehe die vorherigen Abschnitte) auf das Ergebnisbild. Das kommt daher, dass der Fehler mit jedem nachfolgenden Filter größer wird, von der Grenze beginnend zur Mitte hin. Im Folgenden werden vier verschiedene Methoden betrachtet, wie diese Probleme gelöst werden können.
Fehler, die durch undefinierte Pixel verursacht werden, können leicht vermieden werden, indem beispielsweise der Filtermaske entsprechend eine dilatierte Domäne (siehe Morphologie / Grauwerte), gewählt wird. Werden mehrere Filter nacheinander angewendet, so kann die Bilddomäne im voraus den Filtergrößen entsprechend dilatiert werden. Werden beispielsweise mehrere rechteckige Filtermasken beliebiger Größe aufeinanderfolgend verwendet, dann kann die entsprechende Höhen- oder Breitendimension der Dilatationsmaske unter Berücksichtigung der einzelnen Filtermaskendimensionen und der Anzahl Filteroperationen berechnet werden:
.
Nach den Filteroperationen kann die Bilddomäne wieder auf die ursprüngliche
Größe reduziert werden (z.B. mit
).
reduce_domain
Eine andere Möglichkeit ist, die Domäne genauso groß wie benötigt
festzulegen, und dann den Operator
aufzurufen.
Dann werden die Pixel innerhalb der Grenze nach außen kopiert. Damit werden
Fehler vermieden, die von undefinierten Pixel außerhalb der Domäne verursacht
werden. Danach kann die Domäne wieder auf ihre ursprüngliche Größe reduziert
werden. Dieser Prozess sollte vor jedem folgenden Filter wiederholt werden.
Beachten Sie dabei, dass diese Option die Laufzeit beträchtlich erhöht.
expand_domain_gray
Falls die Laufzeit kein Thema ist, kann vor der Anwendung des ersten
Filters der Operator
aufgerufen werden.
Dann ist das gesamte Bild als Domäne definiert, und undefinierte Pixel
werden komplett vermieden.
full_domain
Alternativ dazu kann auch der Operator
aufgerufen
werden, bevor ein Filter eingesetzt wird. Dieser schneidet das Bild auf die
Größe der Domäne zu - die Domäne deckt damit ein komplettes neues Bild ab.
Beachten Sie allerdings, dass sich damit das Koordinatensystem des
zugeschnittenen Bildes im Vergleich zum ursprünglichen Bild ändert, was alle
folgenden Anwendungen betrifft, die sich auf das Bildkoordinatensystem
beziehen (z. B. die Berechnung des Schwerpunktes).
crop_domain