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 n der Anzahl der Kanäle in
Image
entspricht. Für solche Funktionen existiert eine
natürliche Erweiterung des Gradienten: der metrische Tensor
G, welcher es erlaubt, die Größe der Veränderung von
f für jede beliebige Richtung, die durch den
Richtungsvektor v gegeben ist, zu berechnen. Zur
Vereinfachung der Notation wird G als zweidimensionale
Matrix betrachtet. Damit kann die Größe der Veränderung von
f in Richtung v 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 f in der Richtung
v maximal ist. Diese Richtung ist gegeben durch den
Eigenvektor von G, der zum größten Eigenwert von
G 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.
VDas 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
nonmax_suppression_dir(...,NMS,...)
hysteresis_threshold(...,Low,High,1000,...).
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
Typischer Wertebereich: 0.2
≤
Alpha
≤
50.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 Schwellwertbildung erwünscht).
Defaultwert: 20
Wertevorschläge: 5, 10, 15, 20, 25, 30, 40
Typischer Wertebereich: 1
≤
Low
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 Schwellwertbildung erwünscht).
Defaultwert: 40
Wertevorschläge: 10, 15, 20, 25, 30, 40, 50, 60, 70
Typischer Wertebereich: 1
≤
High
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