edges_imageedges_imageEdgesImageEdgesImage (Operator)

Name

edges_imageedges_imageEdgesImageEdgesImage — Kantendetektion mit Deriche-, Lanser-, Shen- oder Canny-Filtern.

Signatur

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

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

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

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

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

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

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

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

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

HImage HImage.EdgesImage(out HImage imaDir, string filter, double alpha, string NMS, HTuple low, HTuple high)

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

Beschreibung

edges_imageedges_imageEdgesImageEdgesImageEdgesImage dient der Detektion von Stufenkanten mittels rekursiver Filter (nach Deriche, Lanser und Shen) bzw. mittels des konventionell über Filtermasken realisierten „Derivative of Gaussian“ Filter, den auch Canny verwendet. Zudem existiert eine sehr schnelle Variante des Sobel-Filters. Konkret stehen somit die Kantenoperatoren

'deriche1', 'lanser1', 'deriche1_int4', 'deriche2', 'lanser2', 'deriche2_int4', 'shen', 'mshen', 'canny' und 'sobel_fast'

zur Verfügung (Parameter FilterFilterFilterFilterfilter).

Die Kantenamplituden werden in ImaAmpImaAmpImaAmpImaAmpimaAmp zurückgeliefert.

Für alle Filter außer 'sobel_fast'"sobel_fast""sobel_fast""sobel_fast""sobel_fast" werden die Kantenrichtungen in ImaDirImaDirImaDirImaDirimaDir zurückgeliefert. Für 'sobel_fast'"sobel_fast""sobel_fast""sobel_fast""sobel_fast" wird die Kantenrichtung aus Geschwindigkeitsgründen nicht berechnet. Deshalb ist in diesem Fall ImaDirImaDirImaDirImaDirimaDir ein leeres Bildobjekt. Die Kantenoperatoren 'deriche1' bzw. 'deriche2' stehen auch für int4-Bilder zur Verfügung. In dem Fall liefert die Routine statt der Amplituden, also dem Betrag der Filterantwort, die eigentliche, vorzeichenbehaftete Filterantwort als int4-Bild. Dieses Verhalten lässt sich durch Verwendung von 'deriche1_int4' bzw. 'deriche2_int4' auch für Byte-Bilder erzwingen. Auf die vorzeichenbehafteten Filterantworten lässt sich edges_imageedges_imageEdgesImageEdgesImageEdgesImage (mit Parameter 'lanser2') neuerlich anwenden, um die zweite Ableitung im Bild zu bestimmen. Die Kantenrichtungen werden in 2-Grad-Schritten kodiert, d.h. eine Kantenrichtung von x Grad (im mathematisch positiven Sinn und bezogen auf die Horizontale) wird zu x / 2 im entsprechenden Ergebnisbild. Außerdem wird auch die Richtung der Helligkeitsänderung berücksichtigt. Bezeichnet den Bildgradienten, ergeben sich folgende Kantenrichtungen r (zurückgeliefert als ) zwischen 0 und 359 Grad: In Bildpunkten mit Kantenamplitude 0 wird als Kantenrichtung der Wert 255 (undefinierte Richtung) zurückgeliefert.

Die „Filterbreite“ (i.e. 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 mittels info_edgesinfo_edgesInfoEdgesInfoEdgesInfoEdges für konkrete Werte des Parameters AlphaAlphaAlphaAlphaalpha abzuschätzen. Sie nimmt bei den Deriche-, Lanser- 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 häufig mittels Filtermasken realisiert. In diesem Fall erhöht sich die Laufzeit natürlich mit wachsender Filterbreite. Die Laufzeit der rekursiver Filter ist hingegen konstant. Das Einzugsgebiet der Deriche-, Lanser bzw. Shen-Filter ist also ohne Mehraufwand beliebig vergrößerbar. Der daraus resultierennde Laufzeitvorteil gegenüber dem Canny-Operator 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 „Vervielfachung“ der Randpunkte fortgesetzt. Das Signal-Rausch-Verhältnis der FilterFilterFilterFilterfilter ist vergleichbar, wenn AlphaAlphaAlphaAlphaalpha wie folgt gewählt wird: Alpha('lanser1') = Alpha('deriche1'), Alpha('deriche2') = Alpha('deriche1') / 2, Alpha('lanser2') = Alpha('deriche2'), Alpha('shen') = Alpha('deriche1') / 2, Alpha('mshen') = Alpha('shen'), Alpha('canny') = 1.77 / Alpha('deriche1'). Die hier eingesetzten rekursiven Filter verzerren in ihrer ursprünglichen Form ('deriche1', 'deriche2', 'shen') die Amplituden diagonaler Kanten. Diese Fehler sind in den zugehörigen modifizierten Operatoren 'lanser1', 'lanser2' und 'mshen' (bei unveränderter Laufzeit) beseitigt.

Bei relativ kleinem Einzugsgebiet der Filter (11 x 11) Bildpunkte, etwa für Alpha ('lanser2' = 0.5) liefern alle (modifizierten) Operatoren praktisch identische Ergebnisse. Erst bei „breiteren“ Filtern zeigen sich Unterschiede: Insbesondere fallen dann die Shen-basierten Operatoren qualitativ ab. Allerdings sind sie die schnellsten der implementierten Operatoren --- dicht gefolgt von den Deriche-Operatoren.

edges_imageedges_imageEdgesImageEdgesImageEdgesImage bietet (optional) die Weiterverarbeitung der Filterergebnisse mittels Non-Maximum-Suppression (NMSNMSNMSNMSNMS = 'nms'/'inms'/'hvnms', sonst Wert '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,...) und hysteresis_threshold(...,Low,High,999,...).

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.

edges_imageedges_imageEdgesImageEdgesImageEdgesImage kann für die Filtertypen 'canny'"canny""canny""canny""canny" und 'sobel_fast'"sobel_fast""sobel_fast""sobel_fast""sobel_fast" auf OpenCL Geräten ausgeführt werden.

Achtung

Die OpenCL-Implementierung von edges_imageedges_imageEdgesImageEdgesImageEdgesImage wird generell von der CPU-Implementierung abweichende Ergebnisse berechnen.

Da edges_imageedges_imageEdgesImageEdgesImageEdgesImage für den 'canny'"canny""canny""canny""canny"-Filter intern Gauss-Faltung verwendet, gelten dieselben Einschränkungen wie für derivate_gaussderivate_gaussDerivateGaussDerivateGaussDerivateGauss: AlphaAlphaAlphaAlphaalpha muss so gewählt werden, dass die resultierende Filtermaske kleiner als 129 Pixel ist.

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)  singlechannelimage(-array) objectHImageHImageHobject (byte / uint2 / int4 / real)

Eingabebilder.

ImaAmpImaAmpImaAmpImaAmpimaAmp (output_object)  (multichannel-)image(-array) objectHImageHImageHobject * (byte / uint2 / int4 / real)

Amplitudenbilder.

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

Richtungsbilder.

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", 'deriche1_int4'"deriche1_int4""deriche1_int4""deriche1_int4""deriche1_int4", 'deriche2'"deriche2""deriche2""deriche2""deriche2", 'deriche2_int4'"deriche2_int4""deriche2_int4""deriche2_int4""deriche2_int4", 'lanser1'"lanser1""lanser1""lanser1""lanser1", 'lanser2'"lanser2""lanser2""lanser2""lanser2", 'mshen'"mshen""mshen""mshen""mshen", 'shen'"shen""shen""shen""shen", 'sobel_fast'"sobel_fast""sobel_fast""sobel_fast""sobel_fast"

Werteliste (für Compute Devices): 'canny'"canny""canny""canny""canny", '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.1

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 / real) (int / long / double) (Hlong / double) (Hlong / double)

Untere Schwelle für Hysterese-Schwellenwertoperation (negativ, falls keine Schwellenwertbildung erwünscht).

Defaultwert: 20

Wertevorschläge: 5, 10, 15, 20, 25, 30, 40

Typischer Wertebereich: 1 ≤ Low Low Low Low low ≤ 255

Minimale Schrittweite: 1

Empfohlene Schrittweite: 5

Restriktion: Low > 1 || Low < 0

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

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

Typischer Wertebereich: 1 ≤ High High High High high ≤ 255

Minimale Schrittweite: 1

Empfohlene Schrittweite: 5

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

Beispiel (HDevelop)

read_image(Image,'fabrik')
edges_image(Image,Amp,Dir,'lanser2',0.5,'none',-1,-1)
hysteresis_threshold(Amp,Margin,20,30,30)

Beispiel (C)

read_image(&Image,"fabrik");
edges_image(Image,&Amp,&Dir,"lanser2",0.5,"none",-1,-1);
hysteresis_threshold(Amp,&Margin,20,30,30);

Beispiel (HDevelop)

read_image(Image,'fabrik')
edges_image(Image,Amp,Dir,'lanser2',0.5,'none',-1,-1)
hysteresis_threshold(Amp,Margin,20,30,30)

Beispiel (HDevelop)

read_image(Image,'fabrik')
edges_image(Image,Amp,Dir,'lanser2',0.5,'none',-1,-1)
hysteresis_threshold(Amp,Margin,20,30,30)

Beispiel (HDevelop)

read_image(Image,'fabrik')
edges_image(Image,Amp,Dir,'lanser2',0.5,'none',-1,-1)
hysteresis_threshold(Amp,Margin,20,30,30)

Ergebnis

Sind die Parameterwerte korrekt und tritt kein Fehler während der Berechnung auf, liefert edges_imageedges_imageEdgesImageEdgesImageEdgesImage 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.

Vorgänger

info_edgesinfo_edgesInfoEdgesInfoEdgesInfoEdges

Nachfolger

thresholdthresholdThresholdThresholdThreshold, hysteresis_thresholdhysteresis_thresholdHysteresisThresholdHysteresisThresholdHysteresisThreshold, close_edges_lengthclose_edges_lengthCloseEdgesLengthCloseEdgesLengthCloseEdgesLength

Alternativen

sobel_dirsobel_dirSobelDirSobelDirSobelDir, frei_dirfrei_dirFreiDirFreiDirFreiDir, kirsch_dirkirsch_dirKirschDirKirschDirKirschDir, prewitt_dirprewitt_dirPrewittDirPrewittDirPrewittDir, robinson_dirrobinson_dirRobinsonDirRobinsonDirRobinsonDir

Siehe auch

info_edgesinfo_edgesInfoEdgesInfoEdgesInfoEdges, nonmax_suppression_ampnonmax_suppression_ampNonmaxSuppressionAmpNonmaxSuppressionAmpNonmaxSuppressionAmp, hysteresis_thresholdhysteresis_thresholdHysteresisThresholdHysteresisThresholdHysteresisThreshold, bandpass_imagebandpass_imageBandpassImageBandpassImageBandpassImage

Literatur

S.Lanser, W.Eckstein: „Eine Modifikation des Deriche-Verfahrens zur Kantendetektion“; 13. DAGM-Symposium, München; Informatik Fachberichte 290; Seite 151 - 158; Springer-Verlag; 1991.
S.Lanser: „Detektion von Stufenkanten mittels rekursiver Filter nach Deriche“; Diplomarbeit; Technische Universität München, Institut für Informatik, Lehrstuhl Prof. Radig; 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; S. 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; S. 167-187; 1987.
R.Deriche: „Optimal Edge Detection Using Recursive Filtering“; Proc. of the First International Conference on Computer Vision, London; S. 501-505; 1987.
R.Deriche: „Fast Algorithms for Low-Level Vision“; IEEE Transactions on Pattern Analysis and Machine Intelligence; PAMI-12, no. 1; S. 78-87; 1990.
S.Castan, J.Zhao und J.Shen: „Optimal Filter for Edge Detection Methods and Results“; Proc. of the First European Conference on Computer Vision, Antibes; Lecture Notes on computer Science; no. 427; S. 12-17; Springer-Verlag; 1990.

Modul

Foundation