KlassenKlassenKlassenKlassen | | | | Operatoren

edges_imageedges_imageEdgesImageedges_imageEdgesImageEdgesImage (Operator)

Name

edges_imageedges_imageEdgesImageedges_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)

Herror edges_image(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 HTuple& Filter, const HTuple& Alpha, const HTuple& NMS, const HTuple& Low, const HTuple& High) const

HImageArray HImageArray::EdgesImage(HImageArray* ImaDir, const HTuple& Filter, const HTuple& Alpha, const HTuple& NMS, const HTuple& Low, const HTuple& High) const

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

void HOperatorSetX.EdgesImage(
[in] IHUntypedObjectX* Image, [out] IHUntypedObjectX*ImaAmp, [out] IHUntypedObjectX*ImaDir, [in] VARIANT Filter, [in] VARIANT Alpha, [in] VARIANT NMS, [in] VARIANT Low, [in] VARIANT High)

IHImageX* HImageX.EdgesImage(
[out] IHImageX*ImaDir, [in] BSTR Filter, [in] double Alpha, [in] BSTR NMS, [in] VARIANT Low, [in] VARIANT High)

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_imageEdgesImageedges_imageEdgesImageEdgesImage 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 FilterFilterFilterFilterFilterfilter).

Die Kantenamplituden werden in ImaAmpImaAmpImaAmpImaAmpImaAmpimaAmp zurückgeliefert.

Für alle Filter außer 'sobel_fast'"sobel_fast""sobel_fast""sobel_fast""sobel_fast""sobel_fast" werden die Kantenrichtungen in ImaDirImaDirImaDirImaDirImaDirimaDir zurückgeliefert. Für 'sobel_fast'"sobel_fast""sobel_fast""sobel_fast""sobel_fast""sobel_fast" wird die Kantenrichtung aus Geschwindigkeitsgründen nicht berechnet. Deshalb ist in diesem Fall ImaDirImaDirImaDirImaDirImaDirimaDir 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_imageEdgesImageedges_imageEdgesImageEdgesImage (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""sobel_fast" (wo die Filtergröße 3x3 ist und AlphaAlphaAlphaAlphaAlphaalpha ignoriert wird) frei wählbar und mittels info_edgesinfo_edgesInfoEdgesinfo_edgesInfoEdgesInfoEdges für konkrete Werte des Parameters AlphaAlphaAlphaAlphaAlphaalpha abzuschätzen. Sie nimmt bei den Deriche-, Lanser- und Shen-Filtern mit AlphaAlphaAlphaAlphaAlphaalpha ab bzw. beim Canny-Filter zu (AlphaAlphaAlphaAlphaAlphaalpha 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 FilterFilterFilterFilterFilterfilter ist vergleichbar, wenn AlphaAlphaAlphaAlphaAlphaalpha 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_imageEdgesImageedges_imageEdgesImageEdgesImage bietet (optional) die Weiterverarbeitung der Filterergebnisse mittels Non-Maximum-Suppression (NMSNMSNMSNMSNMSNMS = 'nms'/'inms'/'hvnms', sonst Wert 'none') und Hysterese-Schwellenwertoperation (LowLowLowLowLowlow,HighHighHighHighHighhigh, 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 NMSNMSNMSNMSNMSNMS auf 'none' gesetzt ist.

Für 'sobel_fast'"sobel_fast""sobel_fast""sobel_fast""sobel_fast""sobel_fast" wird für alle Werte von NMSNMSNMSNMSNMSNMS außer 'none'"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""sobel_fast" auch noch eine Verdünnung der Kanten auf ein Pixel Breite durchgeführt.

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

Achtung

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

Da edges_imageedges_imageEdgesImageedges_imageEdgesImageEdgesImage für den 'canny'"canny""canny""canny""canny""canny"-Filter intern Gauss-Faltung verwendet, gelten dieselben Einschränkungen wie für derivate_gaussderivate_gaussDerivateGaussderivate_gaussDerivateGaussDerivateGauss: AlphaAlphaAlphaAlphaAlphaalpha 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.

Parallelisierung

Parameter

ImageImageImageImageImageimage (input_object)  singlechannelimage(-array) objectHImageHImageHImageHImageXHobject (byte / uint2 / int4 / real)

Eingabebilder.

ImaAmpImaAmpImaAmpImaAmpImaAmpimaAmp (output_object)  (multichannel-)image(-array) objectHImageHImageHImageHImageXHobject * (byte / uint2 / int4 / real)

Amplitudenbilder.

ImaDirImaDirImaDirImaDirImaDirimaDir (output_object)  image(-array) objectHImageHImageHImageHImageXHobject * (direction)

Richtungsbilder.

FilterFilterFilterFilterFilterfilter (input_control)  string HTupleHTupleHTupleVARIANTHtuple (string) (string) (HString) (char*) (BSTR) (char*)

Gewünschter Kanten-Operator.

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

Werteliste: 'canny'"canny""canny""canny""canny""canny", 'deriche1'"deriche1""deriche1""deriche1""deriche1""deriche1", 'deriche1_int4'"deriche1_int4""deriche1_int4""deriche1_int4""deriche1_int4""deriche1_int4", 'deriche2'"deriche2""deriche2""deriche2""deriche2""deriche2", 'deriche2_int4'"deriche2_int4""deriche2_int4""deriche2_int4""deriche2_int4""deriche2_int4", 'lanser1'"lanser1""lanser1""lanser1""lanser1""lanser1", 'lanser2'"lanser2""lanser2""lanser2""lanser2""lanser2", 'mshen'"mshen""mshen""mshen""mshen""mshen", 'shen'"shen""shen""shen""shen""shen", 'sobel_fast'"sobel_fast""sobel_fast""sobel_fast""sobel_fast""sobel_fast"

Werteliste (für Compute Devices): 'canny'"canny""canny""canny""canny""canny", 'sobel_fast'"sobel_fast""sobel_fast""sobel_fast""sobel_fast""sobel_fast"

AlphaAlphaAlphaAlphaAlphaalpha (input_control)  real HTupleHTupleHTupleVARIANTHtuple (real) (double) (double) (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 alpha ≤ 50.0

Minimale Schrittweite: 0.01

Empfohlene Schrittweite: 0.1

Restriktion: Alpha > 0.0

NMSNMSNMSNMSNMSNMS (input_control)  string HTupleHTupleHTupleVARIANTHtuple (string) (string) (HString) (char*) (BSTR) (char*)

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

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

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

LowLowLowLowLowlow (input_control)  integer HTupleHTupleHTupleVARIANTHtuple (integer / real) (int / long / double) (Hlong / double) (Hlong / 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 low ≤ 255

Minimale Schrittweite: 1

Empfohlene Schrittweite: 5

Restriktion: Low > 1 || Low < 0

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

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_imageEdgesImageedges_imageEdgesImageEdgesImage 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>)set_system("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_edgesInfoEdgesinfo_edgesInfoEdgesInfoEdges

Nachfolger

thresholdthresholdThresholdthresholdThresholdThreshold, hysteresis_thresholdhysteresis_thresholdHysteresisThresholdhysteresis_thresholdHysteresisThresholdHysteresisThreshold, close_edges_lengthclose_edges_lengthCloseEdgesLengthclose_edges_lengthCloseEdgesLengthCloseEdgesLength

Alternativen

sobel_dirsobel_dirSobelDirsobel_dirSobelDirSobelDir, frei_dirfrei_dirFreiDirfrei_dirFreiDirFreiDir, kirsch_dirkirsch_dirKirschDirkirsch_dirKirschDirKirschDir, prewitt_dirprewitt_dirPrewittDirprewitt_dirPrewittDirPrewittDir, robinson_dirrobinson_dirRobinsonDirrobinson_dirRobinsonDirRobinsonDir

Siehe auch

info_edgesinfo_edgesInfoEdgesinfo_edgesInfoEdgesInfoEdges, nonmax_suppression_ampnonmax_suppression_ampNonmaxSuppressionAmpnonmax_suppression_ampNonmaxSuppressionAmpNonmaxSuppressionAmp, hysteresis_thresholdhysteresis_thresholdHysteresisThresholdhysteresis_thresholdHysteresisThresholdHysteresisThreshold, bandpass_imagebandpass_imageBandpassImagebandpass_imageBandpassImageBandpassImage

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


KlassenKlassenKlassenKlassen | | | | Operatoren