approx_chain
— Approximation einer Kontur durch Bögen und Linien.
approx_chain
ist veraltet und wird nur aus Gründen
der Rückwärtskompatibilität zur Verfügung gestellt.
approx_chain( : : Row, Column, MinWidthCoord, MaxWidthCoord, ThreshStart, ThreshEnd, ThreshStep, MinWidthSmooth, MaxWidthSmooth, MinWidthCurve, MaxWidthCurve, Weight1, Weight2, Weight3 : ArcCenterRow, ArcCenterCol, ArcAngle, ArcBeginRow, ArcBeginCol, LineBeginRow, LineBeginCol, LineEndRow, LineEndCol, Order)
Die Koordinaten einer Kurve werden durch eine Folge von Linien und Kreisbögen approximiert. Das Verfahren durchläuft dabei für bestimmte Parameter Wertebereiche. In der Parameterliste der Funktion werden die Grenzen dieser Bereiche explizit angegeben (MinWidthCoord ... MaxWidthCoord, ThreshStart ... ThreshEnd, MinWidthSmooth ... MaxWidthSmooth, MinWidthCurve ... MaxWidthCurve). Zusätzlich muss für den Parameterbereich des Schwellenwertes für spitze Ecken auch die Schrittweite angegeben werden (ThreshStep). Durch Einengung der durchlaufenen Bereiche kann die Laufzeit der Berechnung verkürzt, das Ergebnis aber eventuell verschlechtert werden.
Durch die Parameter Weight1, Weight2 und Weight3 kann angegeben werden, ob die gewünschte Gewichtung mehr auf Genauigkeit der Approximation oder Erhalt möglichst vieler großer oder möglichst weniger kleiner Segmente liegt. Für (Weight1,Weight2,Weight3) erzeugt also (1,0,0) eine sehr genaue Approximation (0,1,1) eine Approximation mit möglichst wenigen und großen Segmenten.
Das Ergebnis des Verfahren wird getrennt nach Bögen und Linien zurückgegeben. Ist man an der Reihenfolge der Segmente interessiert, so können die einzelnen Ergebniselemente sukzessive aus den Ergebnistupeln ausgelesen werden, wobei dem Rückgabeparameter Order die Reihenfolge entnommen werden kann (0: nächstes Element ist nächstes Liniensegment, 1: nächstes Element ist nächstes Bogensegment).
Konturen, die eventuell nur aus einem Segment bestehen können, sollten auch mit einem Schwellenwertmaximum (ThreshEnd) > 1.0 untersucht werden, da ansonsten auf jeden Fall mindestens ein „Eckpunkt“ bestimmt wird.
Row
(input_control) point.y-array →
(integer)
Zeilenwert der Kontur.
Defaultwert: 32
Column
(input_control) point.x-array →
(integer)
Spaltenwert der Kontur.
Defaultwert: 32
MinWidthCoord
(input_control) real →
(real)
Minimale Breite des Gaußoperators zur Koordinatenglättung (> 0.4).
Defaultwert: 0.5
Wertevorschläge: 0.5, 0.7, 1.0, 1.2, 1.5, 1.7
Typischer Wertebereich: 0.4
≤
MinWidthCoord
≤
3.0
(lin)
Minimale Schrittweite: 0.01
Empfohlene Schrittweite: 0.1
MaxWidthCoord
(input_control) real →
(real)
Maximale Breite des Gaußoperators zur Koordinatenglättung.
Defaultwert: 2.4
Wertevorschläge: 0.5, 0.7, 1.0, 1.2, 1.5, 1.7
Typischer Wertebereich: 0.4
≤
MaxWidthCoord
≤
3.0
(lin)
Minimale Schrittweite: 0.01
Empfohlene Schrittweite: 0.1
ThreshStart
(input_control) real →
(real)
Minimaler Schwellenwert der Krümmung für die Akzeptierung einer Ecke (relativ zur größten auftretenden Krümmung).
Defaultwert: 0.3
Wertevorschläge: 0.3, 0.4, 0.5, 0.6, 0.7, 0.8
Typischer Wertebereich: 0.1
≤
ThreshStart
≤
0.9
(lin)
Minimale Schrittweite: 0.01
Empfohlene Schrittweite: 0.1
ThreshEnd
(input_control) real →
(real)
Maximaler Schwellenwert der Krümmung für die Akzeptierung einer Ecke (relativ zur größten auftretenden Krümmung).
Defaultwert: 0.9
Wertevorschläge: 0.3, 0.4, 0.5, 0.6, 0.7, 0.8
Typischer Wertebereich: 0.1
≤
ThreshEnd
≤
0.9
(lin)
Minimale Schrittweite: 0.01
Empfohlene Schrittweite: 0.1
ThreshStep
(input_control) real →
(real)
Schrittweite für den Schwellenwertanstieg.
Defaultwert: 0.2
Wertevorschläge: 0.3, 0.4, 0.5
Typischer Wertebereich: 0.1
≤
ThreshStep
≤
0.9
(lin)
Minimale Schrittweite: 0.01
Empfohlene Schrittweite: 0.1
MinWidthSmooth
(input_control) real →
(real)
Minimale Breite des Gaußoperators zur Glättung der Krümmungsfunktion (> 0.4).
Defaultwert: 0.5
Wertevorschläge: 0.5, 0.7, 1.0, 1.2, 1.5, 1.7
Typischer Wertebereich: 0.4
≤
MinWidthSmooth
≤
3.0
(lin)
Minimale Schrittweite: 0.01
Empfohlene Schrittweite: 0.1
MaxWidthSmooth
(input_control) real →
(real)
Maximale Breite des Gaußoperators zur Glättung der Krümmungsfunktion.
Defaultwert: 2.4
Wertevorschläge: 0.5, 0.7, 1.0, 1.2, 1.5, 1.7
Typischer Wertebereich: 0.4
≤
MaxWidthSmooth
≤
3.0
(lin)
Minimale Schrittweite: 0.01
Empfohlene Schrittweite: 0.1
MinWidthCurve
(input_control) integer →
(integer)
Minimale Breite des Kurvenbereichs zur Krümmungsbestimmung (> 0).
Defaultwert: 2
Wertevorschläge: 2, 5, 7
Typischer Wertebereich: 1
≤
MinWidthCurve
≤
12
(lin)
Minimale Schrittweite: 1
Empfohlene Schrittweite: 2
MaxWidthCurve
(input_control) integer →
(integer)
Maximale Breite des Kurvenbereichs zur Krümmungsbestimmung.
Defaultwert: 12
Wertevorschläge: 2, 5, 7
Typischer Wertebereich: 1
≤
MaxWidthCurve
≤
20
(lin)
Minimale Schrittweite: 1
Empfohlene Schrittweite: 2
Weight1
(input_control) real →
(real)
Gewichtungsfaktor für die Approximationsgenauigkeit.
Defaultwert: 1.0
Wertevorschläge: 0.0, 0.5, 1.0
Typischer Wertebereich: 0.0
≤
Weight1
≤
1.0
(lin)
Minimale Schrittweite: 0.1
Empfohlene Schrittweite: 0.5
Weight2
(input_control) real →
(real)
Gewichtungsfaktor für große Segmente.
Defaultwert: 1.0
Wertevorschläge: 0.0, 0.5, 1.0
Typischer Wertebereich: 0.0
≤
Weight2
≤
1.0
(lin)
Minimale Schrittweite: 0.1
Empfohlene Schrittweite: 0.5
Weight3
(input_control) real →
(real)
Gewichtungsfaktor für kleine Segmente.
Defaultwert: 1.0
Wertevorschläge: 0.0, 0.5, 1.0
Typischer Wertebereich: 0.0
≤
Weight3
≤
1.0
(lin)
Minimale Schrittweite: 0.1
Empfohlene Schrittweite: 0.5
ArcCenterRow
(output_control) arc.center.y-array →
(integer)
Zeile des Mittelpunkts eines Bogens.
ArcCenterCol
(output_control) arc.center.x-array →
(integer)
Spalte des Mittelpunkts eines Bogens.
ArcAngle
(output_control) arc.angle.rad-array →
(real)
Winkel eines Bogens.
ArcBeginRow
(output_control) arc.begin.y-array →
(integer)
Zeile des Startpunkts eines Bogens.
ArcBeginCol
(output_control) arc.begin.x-array →
(integer)
Spalte des Startpunkts eines Bogens.
LineBeginRow
(output_control) line.begin.y-array →
(integer)
Zeile des Startpunkts einer Linie.
LineBeginCol
(output_control) line.begin.x-array →
(integer)
Spalte des Startpunkts einer Linie.
LineEndRow
(output_control) line.end.y-array →
(integer)
Zeile des Endpunkts einer Linie.
LineEndCol
(output_control) line.end.x-array →
(integer)
Spalte des Endpunkts einer Linie.
Order
(output_control) integer-array →
(integer)
Reihenfolge von Linien- (Wert 0) und Bogensegmenten (Wert1).
/* read edge image */ read_image(&Image,"fig1_kan"); /* construct edge region */ hysteresis_threshold(Image,&RK1,64,255,40,1); connection(RK1,&Rand); /* fetch chain code */ T_get_region_contour(Rand,&Rows,&Columns); firstline = get_i(Tline,0); firstcol = get_i(Tcol,0); /* approximation with lines and circular arcs */ set_d(t1,0.4,0); set_d(t2,2.4,0); set_d(t3,0.3,0); set_d(t4,0.9,0); set_d(t5,0.2,0); set_d(t6,0.4,0); set_d(t7,2.4,0); set_i(t8,2,0); set_i(t9,12,0); set_d(t10,1.0,0); set_d(t11,1.0,0); set_d(t12,1.0,0); T_approx_chain(Rows,Columns,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12, &Bzl,&Bzc,&Br,&Bwl,&Bwc,&Ll0,&Lc0,&Ll1,&Lc1,&order); nob = length_tuple(Bzl); nol = length_tuple(Ll0); /* draw lines and arcs */ set_i(WindowHandleTuple,WindowHandle,0); set_line_width(WindowHandle,4); if (nob>0) T_disp_arc(Bzl,Bzc,Br,Bwl,Bwc); set_line_width(WindowHandle,1); if (nol>0) T_disp_line(WindowHandleTuple,Ll0,Lc0,Ll1,Lc1);
approx_chain
liefert den Wert 2 (H_MSG_TRUE), falls die Parameter
korrekt sind. Ansonsten wird eine Fehlerbehandlung
durchgeführt.
sobel_amp
,
edges_image
,
get_region_contour
,
threshold
,
hysteresis_threshold
set_line_width
,
disp_arc
,
disp_line
get_region_polygon
,
approx_chain_simple
get_region_chain
,
smallest_circle
,
disp_circle
,
disp_line
Foundation