affine_trans_image_sizeT_affine_trans_image_sizeAffineTransImageSizeAffineTransImageSize (Operator)

Name

affine_trans_image_sizeT_affine_trans_image_sizeAffineTransImageSizeAffineTransImageSize — Anwenden einer beliebigen affinen 2D-Transformation auf Bilder mit Angabe der Ausgabebildgröße.

Signatur

affine_trans_image_size(Image : ImageAffineTrans : HomMat2D, Interpolation, Width, Height : )

Herror T_affine_trans_image_size(const Hobject Image, Hobject* ImageAffineTrans, const Htuple HomMat2D, const Htuple Interpolation, const Htuple Width, const Htuple Height)

void AffineTransImageSize(const HObject& Image, HObject* ImageAffineTrans, const HTuple& HomMat2D, const HTuple& Interpolation, const HTuple& Width, const HTuple& Height)

HImage HImage::AffineTransImageSize(const HHomMat2D& HomMat2D, const HString& Interpolation, Hlong Width, Hlong Height) const

HImage HImage::AffineTransImageSize(const HHomMat2D& HomMat2D, const char* Interpolation, Hlong Width, Hlong Height) const

HImage HImage::AffineTransImageSize(const HHomMat2D& HomMat2D, const wchar_t* Interpolation, Hlong Width, Hlong Height) const   (Nur Windows)

HImage HHomMat2D::AffineTransImageSize(const HImage& Image, const HString& Interpolation, Hlong Width, Hlong Height) const

HImage HHomMat2D::AffineTransImageSize(const HImage& Image, const char* Interpolation, Hlong Width, Hlong Height) const

HImage HHomMat2D::AffineTransImageSize(const HImage& Image, const wchar_t* Interpolation, Hlong Width, Hlong Height) const   (Nur Windows)

static void HOperatorSet.AffineTransImageSize(HObject image, out HObject imageAffineTrans, HTuple homMat2D, HTuple interpolation, HTuple width, HTuple height)

HImage HImage.AffineTransImageSize(HHomMat2D homMat2D, string interpolation, int width, int height)

HImage HHomMat2D.AffineTransImageSize(HImage image, string interpolation, int width, int height)

Beschreibung

affine_trans_image_sizeaffine_trans_image_sizeAffineTransImageSizeAffineTransImageSizeAffineTransImageSize wendet eine beliebige affine 2D-Transformation (Skalierung, Drehung, Verschiebung, Scherung) auf die in ImageImageImageImageimage übergebenen Bilder an und liefert die transformierten Bilder in ImageAffineTransImageAffineTransImageAffineTransImageAffineTransimageAffineTrans zurück. Die Transformation wird durch eine homogene Transformationsmatrix beschrieben, die in HomMat2DHomMat2DHomMat2DHomMat2DhomMat2D übergeben wird. Diese kann mit Hilfe der Operatoren hom_mat2d_identityhom_mat2d_identityHomMat2dIdentityHomMat2dIdentityHomMat2dIdentity, hom_mat2d_scalehom_mat2d_scaleHomMat2dScaleHomMat2dScaleHomMat2dScale, hom_mat2d_rotatehom_mat2d_rotateHomMat2dRotateHomMat2dRotateHomMat2dRotate, hom_mat2d_translatehom_mat2d_translateHomMat2dTranslateHomMat2dTranslateHomMat2dTranslate etc. aufgebaut werden oder das Resultat von Operatoren wie vector_angle_to_rigidvector_angle_to_rigidVectorAngleToRigidVectorAngleToRigidVectorAngleToRigid 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.

Die Region des Eingabebildes wird ignoriert, also als das volle Rechteck der Eingabebildmatrix angenommen. Die Region des Ausgabebildes besteht aus dem transformierten Rechteck des Eingabebildes (gegebenenfalls wird das Ausgabebild mit Nullen, d.h. „schwarz“, aufgefüllt).

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 InterpolationInterpolationInterpolationInterpolationinterpolation gesteuert:

nearest_neighbor

Nächste-Nachbar Interpolation. Der Grauwert des nächstgelegenen Bildpunktes wird verwendet (eventuell niedrigere Qualität, sehr schnell).

bilinear

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).

bicubic

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).

constant

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).

weighted

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'"int_zooming""int_zooming""int_zooming""int_zooming" (siehe set_systemset_systemSetSystemSetSystemSetSystem) die Genauigkeit der Transformation. Falls 'int_zooming'"int_zooming""int_zooming""int_zooming""int_zooming" auf 'true'"true""true""true""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'"int_zooming""int_zooming""int_zooming""int_zooming" = 'false'"false""false""false""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'"int_zooming""int_zooming""int_zooming""int_zooming" auf 'true'"true""true""true""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'"int_zooming""int_zooming""int_zooming""int_zooming" keinen Einfluss, da intern immer mit Gleitkommazahlen gerechnet wird.

Die Größe des Zielbildes wird durch die Parameter WidthWidthWidthWidthwidth und HeightHeightHeightHeightheight angegeben. Beachten Sie, dass das Zielbild grundsätzlich am linken und oberen Rand beschnitten wird, d.h. alle Bildbereiche, die nach der Transformation negative Koordinaten aufweisen, werden abgeschnitten. Bei geeigneter Wahl der affinen Abbildung, insbesondere der Translation, kann somit gleichzeitig ein Teil des Bildes transformiert und ausgeschnitten werden. Dies ist z.B. bei der Verwendung des Variationsmodells nützlich (siehe compare_variation_modelcompare_variation_modelCompareVariationModelCompareVariationModelCompareVariationModel), da mit diesem Mechanismus nur die Teile des Bildes, die untersucht werden sollen, transformiert werden.

Achtung

Die Region des Eingabebildes wird nicht beachtet.

affine_trans_image_sizeaffine_trans_image_sizeAffineTransImageSizeAffineTransImageSizeAffineTransImageSize verwendet nicht das HALCON-Standard-Koordinatensystem (mit dem Ursprung im Mittelpunkt des linken oberen Pixels) sondern das gleiche Koordinatensystem wie affine_trans_pixelaffine_trans_pixelAffineTransPixelAffineTransPixelAffineTransPixel, d.h. der Ursprung liegt in der linken oberen Ecke des linken oberen Pixels. Eine Transformation mit affine_trans_image_sizeaffine_trans_image_sizeAffineTransImageSizeAffineTransImageSizeAffineTransImageSize entspricht für jeden Punkt des Bildes einer Kette von Transformationen (Ein- und Ausgabekoordinaten als homogene Vektoren dargestellt, siehe affine_trans_pixelaffine_trans_pixelAffineTransPixelAffineTransPixelAffineTransPixel). 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_grayarea_center_grayAreaCenterGrayAreaCenterGrayAreaCenterGray abgeleitet wurden. Wenn z.B. ein rotationssymmetrisches Bild unter Verwendung von hom_mat2d_rotatehom_mat2d_rotateHomMat2dRotateHomMat2dRotateHomMat2dRotate um seinen mit area_center_grayarea_center_grayAreaCenterGrayAreaCenterGrayAreaCenterGray 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_sizeaffine_trans_image_sizeAffineTransImageSizeAffineTransImageSizeAffineTransImageSize die Transformationsmatrix HomMat2DHomMat2DHomMat2DHomMat2DhomMat2D 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_size(Image, ImageAffineTrans, HomMat2DAdapted, 'constant', Width, Height)

Ein Überblick zu den verschiedenen in HALCON verwendeten 2D Koordinatensystemen ist in der Einleitung zum Kapitel Transformationen / 2D-Transformationen gegeben.

Ausführungsinformationen

Parameter

ImageImageImageImageimage (input_object)  (multichannel-)image(-array) objectHImageHImageHobject (byte / int2 / uint2 / real)

Eingabebild.

ImageAffineTransImageAffineTransImageAffineTransImageAffineTransimageAffineTrans (output_object)  (multichannel-)image(-array) objectHImageHImageHobject * (byte / int2 / uint2 / real)

Transformiertes Ausgabebild.

HomMat2DHomMat2DHomMat2DHomMat2DhomMat2D (input_control)  hom_mat2d HHomMat2D, HTupleHTupleHtuple (real) (double) (double) (double)

Eingabe-Transformationsmatrix.

InterpolationInterpolationInterpolationInterpolationinterpolation (input_control)  string HTupleHTupleHtuple (string) (string) (HString) (char*)

Art der Interpolation.

Defaultwert: 'constant' "constant" "constant" "constant" "constant"

Werteliste: 'bicubic'"bicubic""bicubic""bicubic""bicubic", 'bilinear'"bilinear""bilinear""bilinear""bilinear", 'constant'"constant""constant""constant""constant", 'nearest_neighbor'"nearest_neighbor""nearest_neighbor""nearest_neighbor""nearest_neighbor", 'weighted'"weighted""weighted""weighted""weighted"

WidthWidthWidthWidthwidth (input_control)  extent.x HTupleHTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Breite des Ausgabebildes.

Defaultwert: 640

Wertevorschläge: 128, 160, 192, 256, 320, 384, 512, 640, 768

HeightHeightHeightHeightheight (input_control)  extent.y HTupleHTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Höhe des Ausgabebildes.

Defaultwert: 480

Wertevorschläge: 120, 128, 144, 240, 256, 288, 480, 512, 576

Ergebnis

Falls die Matrix HomMat2DHomMat2DHomMat2DHomMat2DhomMat2D eine affine Abbildung darstellt (d.h. keine projektive Abbildung), liefert affine_trans_image_sizeaffine_trans_image_sizeAffineTransImageSizeAffineTransImageSizeAffineTransImageSize 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>:)set_system("no_object_result",<Result>)SetSystem("no_object_result",<Result>)SetSystem("no_object_result",<Result>)SetSystem("no_object_result",<Result>) festlegen. Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.

Vorgänger

hom_mat2d_identityhom_mat2d_identityHomMat2dIdentityHomMat2dIdentityHomMat2dIdentity, hom_mat2d_translatehom_mat2d_translateHomMat2dTranslateHomMat2dTranslateHomMat2dTranslate, hom_mat2d_rotatehom_mat2d_rotateHomMat2dRotateHomMat2dRotateHomMat2dRotate, hom_mat2d_scalehom_mat2d_scaleHomMat2dScaleHomMat2dScaleHomMat2dScale, hom_mat2d_reflecthom_mat2d_reflectHomMat2dReflectHomMat2dReflectHomMat2dReflect

Alternativen

affine_trans_imageaffine_trans_imageAffineTransImageAffineTransImageAffineTransImage, zoom_image_sizezoom_image_sizeZoomImageSizeZoomImageSizeZoomImageSize, zoom_image_factorzoom_image_factorZoomImageFactorZoomImageFactorZoomImageFactor, mirror_imagemirror_imageMirrorImageMirrorImageMirrorImage, rotate_imagerotate_imageRotateImageRotateImageRotateImage, affine_trans_regionaffine_trans_regionAffineTransRegionAffineTransRegionAffineTransRegion

Siehe auch

set_part_styleset_part_styleSetPartStyleSetPartStyleSetPartStyle

Modul

Foundation