edges_imageedges_imageEdgesImageEdgesImageedges_image (Operator)

Name

edges_imageedges_imageEdgesImageEdgesImageedges_image — 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)

def edges_image(image: HObject, filter: str, alpha: float, nms: str, low: Union[int, float], high: Union[int, float]) -> Tuple[HObject, HObject]

Beschreibung

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

zur Verfügung (Parameter FilterFilterFilterFilterfilterfilter).

Die Kantenamplituden werden in ImaAmpImaAmpImaAmpImaAmpimaAmpima_amp zurückgeliefert.

Für alle Filter außer 'sobel_fast'"sobel_fast""sobel_fast""sobel_fast""sobel_fast""sobel_fast" werden die Kantenrichtungen in ImaDirImaDirImaDirImaDirimaDirima_dir 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 ImaDirImaDirImaDirImaDirimaDirima_dir ein leeres Bildobjekt. Die Kantenoperatoren 'deriche1'"deriche1""deriche1""deriche1""deriche1""deriche1" bzw. 'deriche2'"deriche2""deriche2""deriche2""deriche2""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'"deriche1_int4""deriche1_int4""deriche1_int4""deriche1_int4""deriche1_int4" bzw. 'deriche2_int4'"deriche2_int4""deriche2_int4""deriche2_int4""deriche2_int4""deriche2_int4" auch für Byte-Bilder erzwingen. Auf die vorzeichenbehafteten Filterantworten lässt sich edges_imageedges_imageEdgesImageEdgesImageEdgesImageedges_image (mit Parameterwert 'lanser2'"lanser2""lanser2""lanser2""lanser2""lanser2") neuerlich anwenden, um die zweite Ableitung im Bild zu bestimmen. Die Kantenrichtungen werden in 2-Grad-Schritten kodiert, d.h. eine Kantenrichtung von Grad (im mathematisch positiven Sinn und bezogen auf die Horizontale) wird zu im entsprechenden Ergebnisbild. Außerdem wird auch die Richtung der Helligkeitsänderung berücksichtigt. Bezeichnet den Bildgradienten, ergeben sich folgende Kantenrichtungen (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_edgesInfoEdgesInfoEdgesInfoEdgesinfo_edges 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 resultierende 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'"deriche1""deriche1""deriche1""deriche1""deriche1", 'deriche2'"deriche2""deriche2""deriche2""deriche2""deriche2", 'shen'"shen""shen""shen""shen""shen") die Amplituden diagonaler Kanten. Diese Fehler sind in den zugehörigen modifizierten Operatoren 'lanser1'"lanser1""lanser1""lanser1""lanser1""lanser1", 'lanser2'"lanser2""lanser2""lanser2""lanser2""lanser2" und 'mshen'"mshen""mshen""mshen""mshen""mshen" (bei unveränderter Laufzeit) beseitigt.

Bei relativ kleinem Einzugsgebiet der Filter (11 x 11) Bildpunkte, etwa für AlphaAlphaAlphaAlphaalphaalpha('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_imageEdgesImageEdgesImageEdgesImageedges_image bietet (optional) die Weiterverarbeitung der Filterergebnisse mittels Non-Maximum-Suppression (NMSNMSNMSNMSNMSnms = 'nms'"nms""nms""nms""nms""nms"/'inms'"inms""inms""inms""inms""inms"/'hvnms'"hvnms""hvnms""hvnms""hvnms""hvnms", sonst Wert 'none'"none""none""none""none""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,...)nonmax_suppression_dir(...,NMS,...)NonmaxSuppressionDir(...,NMS,...)NonmaxSuppressionDir(...,NMS,...)NonmaxSuppressionDir(...,NMS,...)nonmax_suppression_dir(...,NMS,...)
hysteresis_threshold(...,Low,High,999,...)hysteresis_threshold(...,Low,High,999,...)HysteresisThreshold(...,Low,High,999,...)HysteresisThreshold(...,Low,High,999,...)HysteresisThreshold(...,Low,High,999,...)hysteresis_threshold(...,Low,High,999,...).

Die Hysterese-Schwellenwertoperation wird nicht angewandt, wenn NMSNMSNMSNMSNMSnms auf 'none'"none""none""none""none""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_imageEdgesImageEdgesImageEdgesImageedges_image 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_imageEdgesImageEdgesImageEdgesImageedges_image wird generell von der CPU-Implementierung abweichende Ergebnisse berechnen.

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

Ausführungsinformationen

Parameter

ImageImageImageImageimageimage (input_object)  singlechannelimage(-array) objectHImageHObjectHImageHobject (byte / uint2 / int4 / real)

Eingabebilder.

ImaAmpImaAmpImaAmpImaAmpimaAmpima_amp (output_object)  (multichannel-)image(-array) objectHImageHObjectHImageHobject * (byte / uint2 / int4 / real)

Amplitudenbilder.

ImaDirImaDirImaDirImaDirimaDirima_dir (output_object)  image(-array) objectHImageHObjectHImageHobject * (direction)

Richtungsbilder.

FilterFilterFilterFilterfilterfilter (input_control)  string HTuplestrHTupleHtuple (string) (string) (HString) (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 HTuplefloatHTupleHtuple (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

Minimale Schrittweite: 0.01

Empfohlene Schrittweite: 0.1

Restriktion: Alpha > 0.0

NMSNMSNMSNMSNMSnms (input_control)  string HTuplestrHTupleHtuple (string) (string) (HString) (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 HTupleUnion[int, float]HTupleHtuple (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

Minimale Schrittweite: 1

Empfohlene Schrittweite: 5

Restriktion: Low != 0

HighHighHighHighhighhigh (input_control)  integer HTupleUnion[int, float]HTupleHtuple (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

Minimale Schrittweite: 1

Empfohlene Schrittweite: 5

Restriktion: 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_imageEdgesImageEdgesImageEdgesImageedges_image 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>)set_system("no_object_result",<Result>) festlegen. Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.

Vorgänger

info_edgesinfo_edgesInfoEdgesInfoEdgesInfoEdgesinfo_edges

Nachfolger

thresholdthresholdThresholdThresholdThresholdthreshold, hysteresis_thresholdhysteresis_thresholdHysteresisThresholdHysteresisThresholdHysteresisThresholdhysteresis_threshold, close_edges_lengthclose_edges_lengthCloseEdgesLengthCloseEdgesLengthCloseEdgesLengthclose_edges_length

Alternativen

sobel_dirsobel_dirSobelDirSobelDirSobelDirsobel_dir, frei_dirfrei_dirFreiDirFreiDirFreiDirfrei_dir, kirsch_dirkirsch_dirKirschDirKirschDirKirschDirkirsch_dir, prewitt_dirprewitt_dirPrewittDirPrewittDirPrewittDirprewitt_dir, robinson_dirrobinson_dirRobinsonDirRobinsonDirRobinsonDirrobinson_dir

Siehe auch

info_edgesinfo_edgesInfoEdgesInfoEdgesInfoEdgesinfo_edges, nonmax_suppression_ampnonmax_suppression_ampNonmaxSuppressionAmpNonmaxSuppressionAmpNonmaxSuppressionAmpnonmax_suppression_amp, hysteresis_thresholdhysteresis_thresholdHysteresisThresholdHysteresisThresholdHysteresisThresholdhysteresis_threshold, bandpass_imagebandpass_imageBandpassImageBandpassImageBandpassImagebandpass_image

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