edges_color — Farbkantendetektion mit Canny-, Deriche- oder Shen-Filtern.
edges_color extrahiert Farbkanten aus dem Eingabebild
Image. Zur Definition von Farbkanten wird das mehrkanalige
Bild Image als Abbildung betrachtet, wobei der Anzahl der Kanäle in
Image entspricht. Für solche Funktionen existiert eine
natürliche Erweiterung des Gradienten: der metrische Tensor
, welcher es erlaubt, die Größe der Veränderung von
für jede beliebige Richtung, die durch den
Richtungsvektor gegeben ist, zu berechnen. Zur
Vereinfachung der Notation wird als zweidimensionale
Matrix betrachtet. Damit kann die Größe der Veränderung von
in Richtung durch
berechnet werden. Dabei ist
Zur Kantenextraktion werden, wie auch bei edges_image, die
partiellen Ableitungen der Bilder, die im metrischen Tensor
berechnet werden müssen, mit den jeweiligen Kantenfiltern
berechnet. Für Filter = 'canny' werden die
partiellen Ableitungen der Gaußmasken (siehe
derivate_gauss) verwendet, für Filter =
'deriche1' und Filter = 'deriche2' die
entsprechenden Deriche-Filter, für Filter =
'shen' die entsprechenden Shen-Filter und für
Filter = 'sobel_fast' der Sobel-Filter. Wie bei
einkanaligen Bildern wird die Gradientenrichtung dadurch definiert,
dass die Größe der Veränderung von in der Richtung
maximal ist. Diese Richtung ist gegeben durch den
Eigenvektor von , der zum größten Eigenwert von
gehört. Die Wurzel aus dem größten Eigenwert ist das
Äquivalent des Gradientenbetrags (der Amplitude) bei einkanaligen
Bildern. Sie wird in ImaAmp zurückgeliefert. Für
einkanalige Bilder sind beide Definitionen äquivalent. Da der
Gradientenbetrag sich potentiell nicht im Eingabedatentyp (byte oder
uint2) darstellen lässt, wird in ImaAmp der
nächstgrößere Datentyp (uint2 oder int4) verwendet. Der
Eigenvektor liefert gleichzeitig auch die Kantenrichtung. Diese
ist, im Gegensatz zu einkanaligen Bildern, nur modulo 180 Grad
definiert. Die Kantenrichtungen werden wie bei edges_image
in 2-Grad-Schritten kodiert und in ImaDir zurückgeliefert.
In Bildpunkten mit Kantenamplitude 0 wird als Kantenrichtung der
Wert 255 (undefinierte Richtung) zurückgeliefert. Aus
Geschwindigkeitsgründen wird für Filter =
'sobel_fast' das Richtungsbild nicht explizit berechnet,
und kann somit nicht zurückgegeben werden. In diesem Fall ist
ImaDir ein leeres Bildobjekt.
Die „Filterbreite“ (d.h. das Einzugsgebiet der Filter) ist für
alle Filter außer 'sobel_fast' (wo die Filtergröße
3x3 ist und Alpha ignoriert wird) frei
wählbar und kann mittels info_edges für konkrete Werte des
Parameters Alpha abgeschätzt werden. Sie nimmt bei den
Deriche- und Shen-Filtern mit Alpha ab bzw. beim
Canny-Filter zu (Alpha ist in diesem Fall die
Standardabweichung der zugrundeliegenden Gaußfunktion). „Breite“
Filter weisen eine höhere Rauschinvarianz, aber auch ein
verringertes Auflösungsvermögen für Bilddetails auf.
Nicht-rekursive Filter, wie hier die Canny-Filter, werden mittels
Filtermasken realisiert. In diesem Fall erhöht sich die Laufzeit
mit wachsender Filterbreite. Die Laufzeit der rekursiver Filter ist
hingegen konstant. Das Einzugsgebiet der Deriche- und Shen-Filter
ist also ohne Mehraufwand beliebig vergrößerbar. Der daraus
resultierende Laufzeitvorteil gegenüber dem Canny-Filter nimmt
naturgemäß mit wachsender „Filterbreite“ zu. Zur Randbehandlung
wird bei den rekursiven Filtern angenommen, das Bildsignal falle
außerhalb des Bildes auf Null ab. Beim Canny-Operator wird
hingegen das Bild durch Spiegelung der Randpunkte fortgesetzt.
Das Signal-Rausch-Verhältnis der Filter ist vergleichbar,
wenn Alpha wie folgt gewählt wird:
Alpha('deriche2') = Alpha('deriche1') / 2,
Alpha('shen') = Alpha('deriche1') / 2,
Alpha('canny') = 1.77 / Alpha('deriche1').
edges_color bietet (optional) die Weiterverarbeitung der
Filterergebnisse mittels Non-Maximum-Suppression (NMS =
'nms'/'inms'/'hvnms', sonst Wert
'none') und Hysterese-Schwellenwertoperation
(Low,High, falls nicht erwünscht: einer der Werte
negativ). Dies entspricht im wesentlichen nachfolgenden Aufrufen
der Routinen
Die Hysterese-Schwellenwertoperation wird nicht angewandt, wenn
NMS auf 'none' gesetzt ist.
Für 'sobel_fast' wird für alle Werte von NMS
außer 'none' dieselbe Non-Maximum-Suppression ausgeführt.
Zusätzlich wird für 'sobel_fast' auch
noch eine Verdünnung der Kanten auf ein Pixel Breite
durchgeführt.
Beachten Sie, dass Filteroperatoren eventuell unerwartete Resultate ausgeben, wenn ein Bild mit einer reduzierten Domäne als Input übergeben wird. Weitere Informationen können im Kapitel Filter gefunden werden.
Image (input_object) (multichannel-)image(-array) → object (byte / uint2)
Eingabebild.
ImaAmp (output_object) singlechannelimage(-array) → object (uint2 / int4)
Amplitudenbild.
ImaDir (output_object) singlechannelimage(-array) → object (direction)
Richtungsbild.
Filter (input_control) string → (string)
Gewünschter Kanten-Operator.
Defaultwert: 'canny'
Werteliste: 'canny', 'deriche1', 'deriche2', 'shen', 'sobel_fast'
Alpha (input_control) real → (real)
Filterparameter: kleine Werte bewirken starke Glättung, also auch weniger Bilddetails (bei 'canny' umgekehrt).
Defaultwert: 1.0
Wertevorschläge: 0.1, 0.2, 0.3, 0.4, 0.5, 0.7, 0.9, 1.0, 1.1, 1.2, 1.5, 2.0, 2.5, 3.0
Minimale Schrittweite: 0.01
Empfohlene Schrittweite: 0.1
Restriktion: Alpha > 0.0
NMS (input_control) string → (string)
Non-Maximum-Suppression ('none', falls nicht erwünscht).
Defaultwert: 'nms'
Werteliste: 'hvnms', 'inms', 'nms', 'none'
Low (input_control) integer → (integer)
Untere Schwelle für Hysterese-Schwellenwertoperation (negativ, falls keine Schwellenwertbildung erwünscht).
Defaultwert: 20
Wertevorschläge: 5, 10, 15, 20, 25, 30, 40
Minimale Schrittweite: 1
Empfohlene Schrittweite: 5
Restriktion: Low >= 1 || Low < 0
High (input_control) integer → (integer)
Obere Schwelle für Hysterese-Schwellenwertoperation (negativ, falls keine Schwellenwertbildung erwünscht).
Defaultwert: 40
Wertevorschläge: 10, 15, 20, 25, 30, 40, 50, 60, 70
Minimale Schrittweite: 1
Empfohlene Schrittweite: 5
Restriktion: High >= 1 || High < 0 && High >= Low
Sind die Parameterwerte korrekt und tritt kein Fehler während der
Berechnung auf, liefert edges_color den Wert 2 (H_MSG_TRUE). Das
Verhalten bei leerer Eingabe (keine Eingabebilder vorhanden) lässt
sich mittels set_system('no_object_result',<Result>)
festlegen. Gegebenenfalls wird eine Fehlerbehandlung
durchgeführt.
edges_image,
edges_sub_pix,
info_edges,
nonmax_suppression_amp,
hysteresis_threshold
C. Steger: „Subpixel-Precise Extraction of Lines and Edges“;
International Archives of Photogrammetry and Remote Sensing,
vol. XXXIII, part B3; pp. 141-156; 2000.
C. Steger: „Unbiased Extraction of Curvilinear Structures from 2D
and 3D Images“; Herbert Utz Verlag, München; 1998.
S. Di Zenzo: „A Note on the Gradient of a Multi-Image“; Computer
Vision, Graphics, and Image Processing, vol. 33; pp. 116-125;
1986.
Aldo Cumani: „Edge Detection in Multispectral Images“; Computer
Vision, Graphics, and Image Processing: Graphical Models and Image
Processing, vol. 53, no. 1; pp. 40-51; 1991.
J.Canny: „Finding Edges and Lines in Images“; Report, AI-TR-720;
M.I.T. Artificial Intelligence Lab., Cambridge; 1983.
J.Canny: „A Computational Approach to Edge Detection“; IEEE
Transactions on Pattern Analysis and Machine Intelligence; PAMI-8,
vol. 6; pp. 679-698; 1986.
R.Deriche: „Using Canny's Criteria to Derive a Recursively
Implemented Optimal Edge Detector“; International Journal of
Computer Vision; vol. 1, no. 2; pp. 167-187; 1987.
R.Deriche: „Fast Algorithms for Low-Level Vision“; IEEE
Transactions on Pattern Analysis and Machine Intelligence; PAMI-12,
no. 1; pp. 78-87; 1990.
J. Shen, S. Castan: „An Optimal Linear Operator for Step Edge
Detection“; Computer Vision, Graphics, and Image Processing:
Graphical Models and Image Processing, vol. 54, no. 2;
pp. 112-133; 1992.
Foundation