affine_trans_image
— Anwenden einer beliebigen affinen 2D-Transformation auf Bilder.
affine_trans_image(Image : ImageAffineTrans : HomMat2D, Interpolation, AdaptImageSize : )
affine_trans_image
wendet eine beliebige affine
2D-Transformation (Skalierung, Drehung, Verschiebung, Scherung) auf
die in Image
übergebenen Bilder an und liefert die
transformierten Bilder in ImageAffineTrans
zurück. Die
Transformation wird durch eine homogene Transformationsmatrix
beschrieben, die in HomMat2D
übergeben wird. Diese kann
mit Hilfe der Operatoren hom_mat2d_identity
,
hom_mat2d_scale
, hom_mat2d_rotate
,
hom_mat2d_translate
etc. aufgebaut werden oder das Resultat
von Operatoren wie vector_angle_to_rigid
sein.
Die Einträge der homogenen Transformationsmatrix werden so interpretiert, dass die Zeilen-Koordinate des Bildes der x-Koordinate und die Spalten-Koordinate des Bildes der y-Koordinate des Koordinatensystems entspricht, in dem die Transformationsmatrix definiert wurde. Dies ist notwendig, um für das Bild ein rechtshändiges Koordinatensystem zu erhalten. Insbesondere werden dadurch Rotationen im korrekten Drehsinn ausgeführt. Die Koordinatenreihenfolge (x,y) der Matrizen entspricht dann der üblichen Koordinatenreihenfolge (Zeile,Spalte) der Bilder.
Der Definitionsbereich des Eingabebildes wird ignoriert, d.h., als das volle Rechteck des Bildes angenommen. Der Definitionsbereich des Ausgabebildes entspricht der Schnittmenge des transformierten Rechtecks und des Rechtecks des Ausgabebildes.
Im allgemeinen fallen transformierte Punkte zwischen die
Rasterpunkte der Bildmatrix. Es ist also eine geeignete
Interpolation zwischen den Grauwerten des Eingabebildes
durchzuführen. Sie dient insbesondere auch dazu, die
„Klötzchenbildung“ bei Vergrößerungen bzw. Aliasing-Effekte bei
Verkleinerungen zu vermeiden. Die Qualität (bzw. Geschwindigkeit)
der Interpolation wird über den Parameter Interpolation
gesteuert:
Nächste-Nachbar Interpolation. Der Grauwert des nächstgelegenen Bildpunktes wird verwendet (eventuell niedrigere Qualität, sehr schnell).
Bilineare Interpolation. Der Grauwert wird aus den Grauwerten der vier nächstgelegenen Pixel durch bilineare Interpolation berechnet. Falls die affine Transformation eine Skalierung < 1 enthält, wird keine Glättung durchgeführt, was zu erheblichen Aliasingeffekten führen kann (mittlere Qualität und Laufzeit).
Bikubische Interpolation. Der Grauwert wird aus den Grauwerten der nächstgelegenen Pixel durch bikubische Interpolation berechnet. Falls die affine Transformation eine Skalierung < 1 enthält, wird keine Glättung durchgeführt, was zu erheblichen Aliasingeffekten führen kann (hohe Qualität für Vergrößerungen, langsam).
Bilineare Interpolation. Der Grauwert wird aus den Grauwerten der vier nächstgelegenen Pixel durch bilineare Interpolation berechnet. Falls die affine Transformation eine Skalierung < 1 enthält, wird zusätzlich eine Art Mittelwertfilter zur Vermeidung von Aliasingeffekten ausgeführt (mittlere Qualität und Laufzeit).
Bilineare Interpolation. Der Grauwert wird aus den Grauwerten der vier nächstgelegenen Pixel durch bilineare Interpolation berechnet. Falls die affine Transformation eine Skalierung < 1 enthält, wird zusätzlich eine Art Gaußfilter zur Vermeidung von Aliasingeffekten ausgeführt (hohe Qualität, langsam).
Zusätzlich beeinflusst der Systemparameter 'int_zooming'
(siehe set_system
) die Genauigkeit der Transformation.
Falls 'int_zooming' auf 'true' gesetzt wird, wird
die Transformation intern bei byte-, int2- und uint2-Bildern mit
Festkommaarithmetik durchgeführt, was zu wesentlich kürzeren
Laufzeiten führt. Allerdings ist hier die Genauigkeit der
berechneten Grauwerte geringer. Für byte-Bilder sind die
Differenzen zur genaueren Berechnung (mit 'int_zooming' =
'false' ) normalerweise kleiner als zwei Grauwerte. Für
int2- und uint2-Bilder gilt entsprechend, dass die
Grauwertdifferenzen kleiner als 1/128 mal der dynamische
Grauwertbereich des Bildes sind. Sie können also bis zu 512
Grauwerte betragen, wenn der volle Grauwertbereich von 16 Bit
ausgenutzt wird. Auch die Domäne der Ergebnisbilder kann sich
bei Transformationen mit Festkommaarithmetik leicht unterscheiden.
Außerdem können, wenn 'int_zooming' auf
'true' gesetzt ist, undefinierte Grauwerte am unteren und
am rechten Bildrand entstehen wenn ein großer Skalierungsfaktor
angewendet wird und außerdem ein großes Ergebnisbild entsteht. Die
maximale Breite dieses Randes mit undefinierten
Grauwerten kann mit der Formel abgeschätzt werden,
wobei S den Skalierungsfaktor in einer Dimension und I die Größe
des Ausgabebildes in der entsprechenden Dimension darstellt.
Für Real-Bilder hat der Parameter 'int_zooming' keinen Einfluss, da intern immer mit Gleitkommazahlen gerechnet wird.
Die Größe des Zielbildes wird durch den Parameter
AdaptImageSize
gesteuert: Bei 'true' wird die
Größe des Zielbildes so gewählt, dass rechts und unten kein Clipping
auftritt. Bei 'false' hat das Zielbild die gleiche Größe
wie das Eingabebild. Beachten Sie, dass unabhängig von
AdaptImageSize
das Zielbild grundsätzlich am linken und
oberen Rand beschnitten wird, d.h. alle Bildbereiche, die nach der
Transformation negative Koordinaten aufweisen, werden
abgeschnitten.
Die Region des Eingabebildes wird nicht beachtet.
affine_trans_image
verwendet nicht das
HALCON-Standard-Koordinatensystem (mit dem Ursprung im Mittelpunkt
des linken oberen Pixels) sondern das gleiche Koordinatensystem wie
affine_trans_pixel
, d.h. der Ursprung liegt in der linken
oberen Ecke des linken oberen Pixels. Eine Transformation mit
affine_trans_image
entspricht für jeden Punkt des Bildes
einer Kette von Transformationen (Ein- und Ausgabekoordinaten als
homogene Vektoren dargestellt, siehe
affine_trans_pixel
). Dies kann zu unerwarteten Ergebnissen
führen, wenn die Transformationsmatrix unter Verwendung von
Koordinaten erstellt wurde, die von dem Bild mit Operatoren wie
z.B. area_center_gray
abgeleitet wurden. Wenn z.B. ein
rotationssymmetrisches Bild unter Verwendung von
hom_mat2d_rotate
um seinen mit area_center_gray
bestimmten Schwerpunkt rotiert wird, so liegt das transformierte
Bild nicht auf dem Originalbild. Dieser Effekt kann dadurch
kompensiert werden, dass vor dem Aufruf von
affine_trans_image
die Transformationsmatrix
HomMat2D
durch die beiden folgenden Translationen
modifiziert wird:
hom_mat2d_translate(HomMat2D, 0.5, 0.5, HomMat2DTmp) hom_mat2d_translate_local(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted) affine_trans_image(Image, ImageAffineTrans, HomMat2DAdapted, 'constant', 'false')
Ein Überblick zu den verschiedenen in HALCON verwendeten 2D Koordinatensystemen ist in der Einleitung zum Kapitel Transformationen / 2D-Transformationen gegeben.
Image
(input_object) (multichannel-)image(-array) →
object (byte / int2 / uint2 / real)
Eingabebild.
ImageAffineTrans
(output_object) (multichannel-)image(-array) →
object (byte / int2 / uint2 / real)
Transformiertes Ausgabebild.
HomMat2D
(input_control) hom_mat2d →
(real)
Eingabe-Transformationsmatrix.
Interpolation
(input_control) string →
(string)
Art der Interpolation.
Defaultwert: 'constant'
Werteliste: 'bicubic' , 'bilinear' , 'constant' , 'nearest_neighbor' , 'weighted'
AdaptImageSize
(input_control) string →
(string)
Anpassung der Zielbildgröße.
Defaultwert: 'false'
Werteliste: 'false' , 'true'
* Reduction of an image (512 x 512 Pixels) by 50%, rotation * by 180 degrees and translation to the upper-left corner: read_image (Image, 'ic0') hom_mat2d_identity(Matrix1) hom_mat2d_scale(Matrix1,0.5,0.5,256.0,256.0,Matrix2) hom_mat2d_rotate(Matrix2,3.14,256.0,256.0,Matrix3) hom_mat2d_translate(Matrix3,-128.0,-128.0,Matrix4) affine_trans_image(Image,TransImage,Matrix4,'constant','true') * Enlarging the part of an image in the interactively * chosen rectangular window sector: dev_get_window (WindowHandle) draw_rectangle2(WindowHandle,L,C,Phi,L1,L2) hom_mat2d_identity(Matrix1) get_system('width',Width) get_system('height',Height) hom_mat2d_translate(Matrix1,Height/2.0-L,Width/2.0-C,Matrix2) hom_mat2d_rotate(Matrix2,3.14-Phi,Height/2.0,Width/2.0,Matrix3) hom_mat2d_scale(Matrix3,Height/(2.0*L2),Width/(2.0*L1), \ Height/2.0,Width/2.0,Matrix4) affine_trans_image(Image,TransImage,Matrix4,'constant','true')
Falls die Matrix HomMat2D
eine affine Abbildung darstellt
(d.h. keine projektive Abbildung), liefert
affine_trans_image
den Wert 2 (H_MSG_TRUE) zurück. 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.
hom_mat2d_identity
,
hom_mat2d_translate
,
hom_mat2d_rotate
,
hom_mat2d_scale
,
hom_mat2d_reflect
affine_trans_image_size
,
zoom_image_size
,
zoom_image_factor
,
mirror_image
,
rotate_image
,
affine_trans_region
Foundation