edges_sub_pix
— Sub-pixel-genaue Kantendetektion mit Deriche-, Lanser-, Shen- oder
Canny-Filtern.
edges_sub_pix
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. Konkret stehen somit
die Kantenoperatoren
'deriche1', 'lanser1', 'deriche2', 'lanser2', 'shen', 'mshen', 'canny', 'sobel' und 'sobel_fast'
zur Verfügung (Parameter Filter
).
Die extrahierten Kanten werden als sub-pixel-genaue XLD-Konturen in
Edges
zurückgeliefert. Für alle Kantenoperatoren außer
'sobel_fast' werden für jeden Kantenpunkt die folgenden
Attribute definiert (Für weitere Informationen
siehe get_contour_attrib_xld
):
Gibt die Richtung der Kante (nicht der Kontur), berechnet aus den Grauwertgradienten in Spalten- und Zeilenrichtung, an. Die Winkel sind bezüglich der Zeilenachse gegen den Uhrzeigersinn gegeben.
Richtung der Normalenvektoren der Kontur in Radiant. (so orientiert, dass die Normalenvektoren auf die rechte Seite der Kontur in Durchlaufrichtung der Kontur zeigen; die Winkel sind bzgl. der Zeilenachse des Bildes angegeben).
Die Amplitude der Kante.
Die „Filterbreite“ (bzw. das Einzugsgebiet der Filter) ist für alle
Kantenoperatoren außer 'sobel' und 'sobel_fast'
frei wählbar und lässt sich mittels info_edges
für konkrete Werte des
Parameters Alpha
abschätzen. Bei allen Filtern (Deriche-, Lanser-
und Shen-Filtern) bewirkt eine Vergrößerung von Alpha
eine
Verkleinerung der „Filterbreite“. Die einzige Ausnahme bildet der
Canny-Filter, bei dem sich für größer werdende Werte für Alpha
auch
die „Filterbreite“ vergrößert. „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
rekursiven 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, die eine freie Wahl der Filterbreite erlauben, dicht gefolgt von den Deriche-Operatoren. Die beiden Sobel-Filter, die eine feste Maskengröße von (3 x 3) verwenden, sind schneller als die anderen Filter, wobei der Filter 'sobel_fast' erheblich schneller ist als der Filter 'sobel' .
edges_sub_pix
verknüpft die einzelnen Kantenpunkte mit
einem Hysterese-Schwellenwert-artigem Verfahren zu Kanten, wie es auch
in lines_gauss
verwendet wird. Dabei werden Punkte,
deren Amplitude größer als High
ist, sofort als sichere
Kantenpunkte akzeptiert. Punkte, deren Amplitude kleiner als
Low
ist, werden sofort verworfen. Alle Punkte, die eine
zweite Ableitung zwischen diesen zwei Werten besitzen, werden
akzeptiert, wenn sie durch einen Pfad mit sicheren Punkten verbunden
sind (siehe lines_gauss
und
hysteresis_threshold
).
Da Kantenextraktoren oftmals bestimmte Kreuzungspunkte nicht
extrahieren können, kann durch Anhängen von '_junctions'
an die oben beschriebenen Werte von Filter
versucht werden,
diese mit anderen Mitteln zu extrahieren. Dieser Modus ist analog
zu dem bei lines_gauss
verfügbaren Modus zur
Vervollständigung von Kreuzungspunkten.
Der Kantenoperator 'sobel_fast' hat dieselbe Semantik wie alle anderen Kantenoperatoren, basiert intern aber auf einer stark vereinfachten Variante der einzelnen Schritte (Hysterese-Schwellenwert-Operation, Verknüpfung der Kantenpunkte, Extraktion der Subpixel-Position). Daher können die Ergebnisse von 'sobel_fast' in manchen Fällen eine geringere Genauigkeit als die Ergebnisse der anderen Filter aufweisen und andere Kantenteile selektieren.
edges_sub_pix
kann für die Filtertypen 'canny' und
'sobel_fast' auf OpenCL Geräten ausgeführt werden. Dazu werden bis
zu Breite*Höhe*29 Bytes pinned Speicher benötigt. Daher sollte der
pinned Speichercache auf mindestens diese Größe gesetzt werden (mit
set_compute_device_param
und dem Parameter
'pinned_mem_cache_capacity' , oder die Verwendung von
pinned Speicher komplett abzuschalten (mit set_compute_device_param
und dem Parameter 'alloc_pinned' ) - dann wird der normale
Speichercache verwendet. Die Ergebnisse können dabei von dem der
CPU-Implementierung abweichen.
Da edges_sub_pix
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.
In HALCON XL kann edges_sub_pix
gar nicht auf OpenCL-Geräten
ausgeführt werden, da dafür doppelt genaue Fließkommaarithmetik notwendig
wäre, OpenCL-Geräte aber nur für einfach genaue Fließkommaarithmetik
optimiert sind.
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.
Dieser Operator unterstützt Cancel-Timeouts und Interrupts.
Image
(input_object) singlechannelimage →
object (byte / uint2 / real)
Eingabebild.
Edges
(output_object) xld_cont-array →
object
Extrahierte Kanten.
Filter
(input_control) string →
(string)
Gewünschter Kanten-Operator.
Defaultwert: 'canny'
Werteliste: 'canny' , 'canny_junctions' , 'deriche1' , 'deriche1_junctions' , 'deriche2' , 'deriche2_junctions' , 'lanser1' , 'lanser1_junctions' , 'lanser2' , 'lanser2_junctions' , 'mshen' , 'mshen_junctions' , 'shen' , 'shen_junctions' , 'sobel' , 'sobel_fast' , 'sobel_junctions'
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
Low
(input_control) integer →
(integer / real)
Untere Schwelle für Hysterese-Schwellenwertoperation.
Defaultwert: 20
Wertevorschläge: 5, 10, 15, 20, 25, 30, 40
Typischer Wertebereich: 1
≤
Low
≤
255
Minimale Schrittweite: 1
Empfohlene Schrittweite: 5
Restriktion: Low > 0
High
(input_control) integer →
(integer / real)
Obere Schwelle für Hysterese-Schwellenwertoperation.
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 > 0 && High >= Low
read_image(Image,'fabrik') edges_sub_pix(Image,Edges,'lanser2',0.5,20,40)
Sei A die Anzahl von Pixeln in der Region von Image
.
Dann ist die Laufzeitkomplexität O(A*Alpha) für den
Canny-Filter und O(A) für die rekursiven Lanser-, Deriche- und
Shen-Filter.
Der Bedarf an temporären Speicher ist abhängig von der Höhe H der Region
von Image
und der Breite W von Image
. Sei
S = W*H, dann benötigt edges_sub_pix
mindestens
60*S Bytes an temporärem Speicher bei der Ausführung für alle
Kantenoperatoren außer 'sobel_fast' . Für
'sobel_fast' werden mindestens 9*S Bytes an temporärem
Speicher benötigt.
Sind die Parameterwerte korrekt und tritt kein Fehler während der
Berechnung auf, liefert edges_sub_pix
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.
segment_contours_xld
,
gen_polygons_xld
,
select_shape_xld
sobel_dir
,
frei_dir
,
kirsch_dir
,
prewitt_dir
,
robinson_dir
,
edges_image
info_edges
,
hysteresis_threshold
,
bandpass_image
,
lines_gauss
,
lines_facet
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.
2D Metrology