Dieses Kapitel beschreibt Operatoren, die zum Filtern verwendet werden können.
Filter sind ein fester Bestandteil von fast jeder Aufgabe der
Bildverarbeitung. Beispielsweise kann
zum Glätten von
Bildern verwendet werden, mean_image
extrahiert sub-pixel
genau Kanten, und edges_sub_pix
kann verwendet werden, um die
Fourier-Transformation eines Bildes zu berechnen.
fft_image
In diesem Kapitel werden wir einen genaueren Blick auf spezielle Probleme werfen: Der Verwendung eines Bildes mit einer reduzierten Domäne und der Problematik, was passiert, wenn mehrere Filter nacheinander auf ein Bild angewendet werden.
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, da Grauwerte, die eigentlich außerhalb der Domäne liegen, auch als Input für den Filter benutzt werden. Um dies besser zu verstehen, müssen wir uns die Definition der Domäne in diesem speziellen Fall genauer ansehen: Für einen Filter definiert die Domäne, für welche Input-Pixel Output-Pixel berechnet werden müssen. Dennoch können auch Pixel außerhalb der Domäne (die innerhalb der Bildmatrix liegen) für die Verarbeitung genutzt werden.
Operatoren, die ein Bild als Ergebnis zurückgeben, liefern nur Resultate für Pixel zurück, die in der Inputdomäne vorhanden waren.
Aus Performancegründen werden Pixel außerhalb der Bilddomäne 'undefiniert'.
Diese undefinierten Pixel können 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
führt zu Artefakten außerhalb der ursprünglichen Domäne.
full_domain
Ein anderer Grund für Probleme sind undefinierte Pixel außerhalb der Domäne, falls zwei oder mehr Filter nacheinander angewendet werden, da die Filter auch die undefinierten Pixel an der Grenze der Domäne in ihre Berechnung mit einbeziehen. Das bedeutet, 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 eine Domäne gewählt wird, die
bedeutend größer ist als der Bildteil, der tatsächlich benötigt wird.
Nachdem ein Filter angewendet wurde, kann dann die Domäne um die
halbe Filtergröße verkleinert werden (beispielsweise mit den Operatoren
und erosion_rectangle1
). Damit werden die
Bereiche des Bildes, die falsche Werte enthalten, ausgeschlossen, und
erhöhen damit nicht den Fehler für die nächsten Filter.
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 for 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