edges_coloredges_colorEdgesColorEdgesColor (Operator)

Name

edges_coloredges_colorEdgesColorEdgesColor — Farbkantendetektion mit Canny-, Deriche- oder Shen-Filtern.

Signatur

edges_color(Image : ImaAmp, ImaDir : Filter, Alpha, NMS, Low, High : )

Herror edges_color(const Hobject Image, Hobject* ImaAmp, Hobject* ImaDir, const char* Filter, double Alpha, const char* NMS, const Hlong Low, const Hlong High)

Herror T_edges_color(const Hobject Image, Hobject* ImaAmp, Hobject* ImaDir, const Htuple Filter, const Htuple Alpha, const Htuple NMS, const Htuple Low, const Htuple High)

void EdgesColor(const HObject& Image, HObject* ImaAmp, HObject* ImaDir, const HTuple& Filter, const HTuple& Alpha, const HTuple& NMS, const HTuple& Low, const HTuple& High)

HImage HImage::EdgesColor(HImage* ImaDir, const HString& Filter, double Alpha, const HString& NMS, Hlong Low, Hlong High) const

HImage HImage::EdgesColor(HImage* ImaDir, const char* Filter, double Alpha, const char* NMS, Hlong Low, Hlong High) const

HImage HImage::EdgesColor(HImage* ImaDir, const wchar_t* Filter, double Alpha, const wchar_t* NMS, Hlong Low, Hlong High) const   (Nur Windows)

static void HOperatorSet.EdgesColor(HObject image, out HObject imaAmp, out HObject imaDir, HTuple filter, HTuple alpha, HTuple NMS, HTuple low, HTuple high)

HImage HImage.EdgesColor(out HImage imaDir, string filter, double alpha, string NMS, int low, int high)

Beschreibung

edges_coloredges_colorEdgesColorEdgesColorEdgesColor extrahiert Farbkanten aus dem Eingabebild ImageImageImageImageimage. Zur Definition von Farbkanten wird das mehrkanalige Bild ImageImageImageImageimage als Abbildung betrachtet, wobei n der Anzahl der Kanäle in ImageImageImageImageimage 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_imageedges_imageEdgesImageEdgesImageEdgesImage, die partiellen Ableitungen der Bilder, die im metrischen Tensor berechnet werden müssen, mit den jeweiligen Kantenfiltern berechnet. Für FilterFilterFilterFilterfilter = 'canny'"canny""canny""canny""canny" werden die partiellen Ableitungen der Gaußmasken (siehe derivate_gaussderivate_gaussDerivateGaussDerivateGaussDerivateGauss) verwendet, für FilterFilterFilterFilterfilter = 'deriche1'"deriche1""deriche1""deriche1""deriche1" und FilterFilterFilterFilterfilter = 'deriche2'"deriche2""deriche2""deriche2""deriche2" die entsprechenden Deriche-Filter, für FilterFilterFilterFilterfilter = 'shen'"shen""shen""shen""shen" die entsprechenden Shen-Filter und für FilterFilterFilterFilterfilter = 'sobel_fast'"sobel_fast""sobel_fast""sobel_fast""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 ImaAmpImaAmpImaAmpImaAmpimaAmp 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 ImaAmpImaAmpImaAmpImaAmpimaAmp 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_imageedges_imageEdgesImageEdgesImageEdgesImage in 2-Grad-Schritten kodiert und in ImaDirImaDirImaDirImaDirimaDir zurückgeliefert. In Bildpunkten mit Kantenamplitude 0 wird als Kantenrichtung der Wert 255 (undefinierte Richtung) zurückgeliefert. Aus Geschwindigkeitsgründen wird für FilterFilterFilterFilterfilter = 'sobel_fast'"sobel_fast""sobel_fast""sobel_fast""sobel_fast" das Richtungsbild nicht explizit berechnet, und kann somit nicht zurückgegeben werden. In diesem Fall ist ImaDirImaDirImaDirImaDirimaDir ein leeres Bildobjekt.

Die „Filterbreite“ (d.h. das Einzugsgebiet der Filter) ist für alle Filter außer 'sobel_fast'"sobel_fast""sobel_fast""sobel_fast""sobel_fast" (wo die Filtergröße 3x3 ist und AlphaAlphaAlphaAlphaalpha ignoriert wird) frei wählbar und kann mittels info_edgesinfo_edgesInfoEdgesInfoEdgesInfoEdges für konkrete Werte des Parameters AlphaAlphaAlphaAlphaalpha abgeschätzt werden. Sie nimmt bei den Deriche- und Shen-Filtern mit AlphaAlphaAlphaAlphaalpha ab bzw. beim Canny-Filter zu (AlphaAlphaAlphaAlphaalpha 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 FilterFilterFilterFilterfilter ist vergleichbar, wenn AlphaAlphaAlphaAlphaalpha wie folgt gewählt wird: Alpha('deriche2') = Alpha('deriche1') / 2, Alpha('shen') = Alpha('deriche1') / 2, Alpha('canny') = 1.77 / Alpha('deriche1').

edges_coloredges_colorEdgesColorEdgesColorEdgesColor bietet (optional) die Weiterverarbeitung der Filterergebnisse mittels Non-Maximum-Suppression (NMSNMSNMSNMSNMS = 'nms'"nms""nms""nms""nms"/'inms'"inms""inms""inms""inms"/'hvnms'"hvnms""hvnms""hvnms""hvnms", sonst Wert 'none'"none""none""none""none") und Hysterese-Schwellenwertoperation (LowLowLowLowlow,HighHighHighHighhigh, 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 NMSNMSNMSNMSNMS auf 'none' gesetzt ist.

Für 'sobel_fast'"sobel_fast""sobel_fast""sobel_fast""sobel_fast" wird für alle Werte von NMSNMSNMSNMSNMS außer 'none'"none""none""none""none" dieselbe Non-Maximum-Suppression ausgeführt. Zusätzlich wird für 'sobel_fast'"sobel_fast""sobel_fast""sobel_fast""sobel_fast" auch noch eine Verdünnung der Kanten auf ein Pixel Breite durchgeführt.

Achtung

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.

Ausführungsinformationen

Parameter

ImageImageImageImageimage (input_object)  (multichannel-)image(-array) objectHImageHImageHobject (byte / uint2)

Eingabebild.

ImaAmpImaAmpImaAmpImaAmpimaAmp (output_object)  singlechannelimage(-array) objectHImageHImageHobject * (uint2 / int4)

Amplitudenbild.

ImaDirImaDirImaDirImaDirimaDir (output_object)  singlechannelimage(-array) objectHImageHImageHobject * (direction)

Richtungsbild.

FilterFilterFilterFilterfilter (input_control)  string HTupleHTupleHtuple (string) (string) (HString) (char*)

Gewünschter Kanten-Operator.

Defaultwert: 'canny' "canny" "canny" "canny" "canny"

Werteliste: 'canny'"canny""canny""canny""canny", 'deriche1'"deriche1""deriche1""deriche1""deriche1", 'deriche2'"deriche2""deriche2""deriche2""deriche2", 'shen'"shen""shen""shen""shen", 'sobel_fast'"sobel_fast""sobel_fast""sobel_fast""sobel_fast"

AlphaAlphaAlphaAlphaalpha (input_control)  real HTupleHTupleHtuple (real) (double) (double) (double)

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 Alpha Alpha Alpha alpha ≤ 50.0

Minimale Schrittweite: 0.01

Empfohlene Schrittweite: 0.1

Restriktion: Alpha > 0.0

NMSNMSNMSNMSNMS (input_control)  string HTupleHTupleHtuple (string) (string) (HString) (char*)

Non-Maximum-Suppression ('none', falls nicht erwünscht).

Defaultwert: 'nms' "nms" "nms" "nms" "nms"

Werteliste: 'hvnms'"hvnms""hvnms""hvnms""hvnms", 'inms'"inms""inms""inms""inms", 'nms'"nms""nms""nms""nms", 'none'"none""none""none""none"

LowLowLowLowlow (input_control)  integer HTupleHTupleHtuple (integer) (int / long) (Hlong) (Hlong)

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 Low Low Low low

Minimale Schrittweite: 1

Empfohlene Schrittweite: 5

Restriktion: Low >= 1 || Low < 0

HighHighHighHighhigh (input_control)  integer HTupleHTupleHtuple (integer) (int / long) (Hlong) (Hlong)

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 High High High high

Minimale Schrittweite: 1

Empfohlene Schrittweite: 5

Restriktion: High >= 1 || High < 0 && High >= Low

Ergebnis

Sind die Parameterwerte korrekt und tritt kein Fehler während der Berechnung auf, liefert edges_coloredges_colorEdgesColorEdgesColorEdgesColor den Wert 2 (H_MSG_TRUE). Das Verhalten bei leerer Eingabe (keine Eingabebilder vorhanden) lässt sich mittels set_system('no_object_result',<Result>)set_system("no_object_result",<Result>)SetSystem("no_object_result",<Result>)SetSystem("no_object_result",<Result>)SetSystem("no_object_result",<Result>) festlegen. Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.

Nachfolger

thresholdthresholdThresholdThresholdThreshold

Alternativen

edges_color_sub_pixedges_color_sub_pixEdgesColorSubPixEdgesColorSubPixEdgesColorSubPix

Siehe auch

edges_imageedges_imageEdgesImageEdgesImageEdgesImage, edges_sub_pixedges_sub_pixEdgesSubPixEdgesSubPixEdgesSubPix, info_edgesinfo_edgesInfoEdgesInfoEdgesInfoEdges, nonmax_suppression_ampnonmax_suppression_ampNonmaxSuppressionAmpNonmaxSuppressionAmpNonmaxSuppressionAmp, hysteresis_thresholdhysteresis_thresholdHysteresisThresholdHysteresisThresholdHysteresisThreshold

Literatur

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.

Modul

Foundation