edges_image
— Kantendetektion mit Deriche-, Lanser-, Shen- oder Canny-Filtern.
edges_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', 'lanser1', 'deriche1_int4', 'deriche2', 'lanser2', 'deriche2_int4', 'shen', 'mshen', 'canny' und 'sobel_fast'
zur Verfügung (Parameter Filter
).
Die Kantenamplituden werden in ImaAmp
zurückgeliefert.
Für alle Filter außer 'sobel_fast' werden die
Kantenrichtungen in ImaDir
zurückgeliefert. Für
'sobel_fast' wird die Kantenrichtung aus
Geschwindigkeitsgründen nicht berechnet. Deshalb ist in diesem
Fall ImaDir
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_image
(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' (wo die Filtergröße
3x3 ist und Alpha
ignoriert wird) frei
wählbar und mittels info_edges
für konkrete Werte des
Parameters Alpha
abzuschätzen. Sie nimmt bei den
Deriche-, Lanser- 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 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 Filter
ist vergleichbar, wenn Alpha
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_image
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,...) und
hysteresis_threshold(...,Low,High,999,...).
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.
edges_image
kann für die Filtertypen 'canny' und
'sobel_fast' auf OpenCL Geräten ausgeführt werden.
Die OpenCL-Implementierung von edges_image
wird generell von der
CPU-Implementierung abweichende Ergebnisse berechnen.
Da edges_image
für den 'canny' -Filter intern Gauss-Faltung
verwendet, gelten dieselben Einschränkungen wie für derivate_gauss
:
Alpha
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.
Image
(input_object) singlechannelimage(-array) →
object (byte / uint2 / int4 / real)
Eingabebilder.
ImaAmp
(output_object) (multichannel-)image(-array) →
object (byte / uint2 / int4 / real)
Amplitudenbilder.
ImaDir
(output_object) image(-array) →
object (direction)
Richtungsbilder.
Filter
(input_control) string →
(string)
Gewünschter Kanten-Operator.
Defaultwert: 'canny'
Werteliste: 'canny' , 'deriche1' , 'deriche1_int4' , 'deriche2' , 'deriche2_int4' , 'lanser1' , 'lanser2' , 'mshen' , 'shen' , 'sobel_fast'
Werteliste (für Compute Devices): 'canny' , '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.1
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 / real)
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
≤
255
Minimale Schrittweite: 1
Empfohlene Schrittweite: 5
Restriktion: Low > 1 || Low < 0
High
(input_control) integer →
(integer / real)
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
≤
255
Minimale Schrittweite: 1
Empfohlene Schrittweite: 5
Restriktion: High > 1 || High < 0 && High >= Low
read_image(Image,'fabrik') edges_image(Image,Amp,Dir,'lanser2',0.5,'none',-1,-1) hysteresis_threshold(Amp,Margin,20,30,30)
Sind die Parameterwerte korrekt und tritt kein Fehler während der
Berechnung auf, liefert edges_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>)
festlegen. Gegebenenfalls wird eine Fehlerbehandlung
durchgeführt.
threshold
,
hysteresis_threshold
,
close_edges_length
sobel_dir
,
frei_dir
,
kirsch_dir
,
prewitt_dir
,
robinson_dir
info_edges
,
nonmax_suppression_amp
,
hysteresis_threshold
,
bandpass_image
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.
Foundation