Operator Reference

projective_trans_imageT_projective_trans_imageProjectiveTransImageProjectiveTransImageprojective_trans_image (Operator)

projective_trans_imageT_projective_trans_imageProjectiveTransImageProjectiveTransImageprojective_trans_image — Apply a projective transformation to an image.

Signature

Herror T_projective_trans_image(const Hobject Image, Hobject* TransImage, const Htuple HomMat2D, const Htuple Interpolation, const Htuple AdaptImageSize, const Htuple TransformDomain)

void ProjectiveTransImage(const HObject& Image, HObject* TransImage, const HTuple& HomMat2D, const HTuple& Interpolation, const HTuple& AdaptImageSize, const HTuple& TransformDomain)

HImage HImage::ProjectiveTransImage(const HHomMat2D& HomMat2D, const HString& Interpolation, const HString& AdaptImageSize, const HString& TransformDomain) const

HImage HImage::ProjectiveTransImage(const HHomMat2D& HomMat2D, const char* Interpolation, const char* AdaptImageSize, const char* TransformDomain) const

HImage HImage::ProjectiveTransImage(const HHomMat2D& HomMat2D, const wchar_t* Interpolation, const wchar_t* AdaptImageSize, const wchar_t* TransformDomain) const   ( Windows only)

HImage HHomMat2D::ProjectiveTransImage(const HImage& Image, const HString& Interpolation, const HString& AdaptImageSize, const HString& TransformDomain) const

HImage HHomMat2D::ProjectiveTransImage(const HImage& Image, const char* Interpolation, const char* AdaptImageSize, const char* TransformDomain) const

HImage HHomMat2D::ProjectiveTransImage(const HImage& Image, const wchar_t* Interpolation, const wchar_t* AdaptImageSize, const wchar_t* TransformDomain) const   ( Windows only)

static void HOperatorSet.ProjectiveTransImage(HObject image, out HObject transImage, HTuple homMat2D, HTuple interpolation, HTuple adaptImageSize, HTuple transformDomain)

HImage HImage.ProjectiveTransImage(HHomMat2D homMat2D, string interpolation, string adaptImageSize, string transformDomain)

HImage HHomMat2D.ProjectiveTransImage(HImage image, string interpolation, string adaptImageSize, string transformDomain)

def projective_trans_image(image: HObject, hom_mat_2d: Sequence[float], interpolation: str, adapt_image_size: str, transform_domain: str) -> HObject

Description

projective_trans_imageprojective_trans_imageProjectiveTransImageProjectiveTransImageprojective_trans_image applies the projective transformation (homography) determined by the homogeneous transformation matrix HomMat2DHomMat2DHomMat2DhomMat2Dhom_mat_2d on the input image ImageImageImageimageimage and stores the result into the output image TransImageTransImageTransImagetransImagetrans_image.

If the parameter AdaptImageSizeAdaptImageSizeAdaptImageSizeadaptImageSizeadapt_image_size is set to 'false'"false""false""false""false", TransImageTransImageTransImagetransImagetrans_image will have the same size as ImageImageImageimageimage; if AdaptImageSizeAdaptImageSizeAdaptImageSizeadaptImageSizeadapt_image_size is 'true'"true""true""true""true", the output image size will be automatically adapted so that all non-negative points of the transformed image are visible.

The parameter InterpolationInterpolationInterpolationinterpolationinterpolation determines, which interpolation method is used to determine the gray values of the output image. For InterpolationInterpolationInterpolationinterpolationinterpolation = 'nearest_neighbor'"nearest_neighbor""nearest_neighbor""nearest_neighbor""nearest_neighbor", the gray value is determined from the nearest pixel in the input image. This mode is very fast, but also leads to the typical “jagged” appearance for large enlargements of the image. For InterpolationInterpolationInterpolationinterpolationinterpolation = 'bilinear'"bilinear""bilinear""bilinear""bilinear", the gray values are interpolated bilinearly, leading to longer runtimes, but also to significantly improved results.

The parameter TransformDomainTransformDomainTransformDomaintransformDomaintransform_domain can be used to determine whether the domain of ImageImageImageimageimage is also transformed. Since the transformation of the domain costs runtime, this parameter should be used to specify whether this is desired or not. If TransformDomainTransformDomainTransformDomaintransformDomaintransform_domain is set to 'false'"false""false""false""false" the domain of the input image is ignored and the complete image is transformed.

The projective transformation matrix could for example be created using the operator vector_to_proj_hom_mat2dvector_to_proj_hom_mat2dVectorToProjHomMat2dVectorToProjHomMat2dvector_to_proj_hom_mat2d.

In a homography the points to be projected are represented by homogeneous vectors of the form (x,y,w). A Euclidean point can be derived as (x',y') = .

Just like in affine_trans_imageaffine_trans_imageAffineTransImageAffineTransImageaffine_trans_image, x represents the row coordinate while y represents the column coordinate in projective_trans_imageprojective_trans_imageProjectiveTransImageProjectiveTransImageprojective_trans_image. With this convention, affine transformations are a special case of projective transformations in which the last row of HomMat2DHomMat2DHomMat2DhomMat2Dhom_mat_2d is of the form (0,0,c).

For images of type byte or uint2 the system parameter 'int_zooming'"int_zooming""int_zooming""int_zooming""int_zooming" selects between fast calculation in floating point arithmetics ('int_zooming'"int_zooming""int_zooming""int_zooming""int_zooming" = 'true'"true""true""true""true") and highly accurate floating point arithmetics ('int_zooming'"int_zooming""int_zooming""int_zooming""int_zooming" = 'false'"false""false""false""false"). Especially for InterpolationInterpolationInterpolationinterpolationinterpolation = 'bilinear'"bilinear""bilinear""bilinear""bilinear", however, the faster calculation can lead to minor gray value deviations since the faster algorithm is less accurate and only has an accuracy around times the size of the image. Therefore, when applying large scales 'int_zooming'"int_zooming""int_zooming""int_zooming""int_zooming" = 'false'"false""false""false""false" is recommended.

Attention

The used coordinate system is the same as in affine_trans_pixelaffine_trans_pixelAffineTransPixelAffineTransPixelaffine_trans_pixel. This means that in fact not HomMat2DHomMat2DHomMat2DhomMat2Dhom_mat_2d is applied but a modified version. Therefore, applying projective_trans_imageprojective_trans_imageProjectiveTransImageProjectiveTransImageprojective_trans_image corresponds to the following chain of transformations, which is applied to each point of the image (input and output pixels as homogeneous vectors):

As an effect, you might get unexpected results when creating projective transformations based on coordinates that are derived from the image, e.g., by operators like area_center_grayarea_center_grayAreaCenterGrayAreaCenterGrayarea_center_gray. For example, if you use this operator to calculate the center of gravity of a rotationally symmetric image and then rotate the image around this point using hom_mat2d_rotatehom_mat2d_rotateHomMat2dRotateHomMat2dRotatehom_mat2d_rotate, the resulting image will not lie on the original one. In such a case, you can compensate this effect by applying the following translations to HomMat2DHomMat2DHomMat2DhomMat2Dhom_mat_2d before using it in projective_trans_imageprojective_trans_imageProjectiveTransImageProjectiveTransImageprojective_trans_image:

hom_mat2d_translate(HomMat2D, 0.5, 0.5, HomMat2DTmp)hom_mat2d_translate(HomMat2D, 0.5, 0.5, HomMat2DTmp)HomMat2dTranslate(HomMat2D, 0.5, 0.5, HomMat2DTmp)HomMat2dTranslate(HomMat2D, 0.5, 0.5, HomMat2DTmp)hom_mat2d_translate(HomMat2D, 0.5, 0.5, HomMat2DTmp)
hom_mat2d_translate_local(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)hom_mat2d_translate_local(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)HomMat2dTranslateLocal(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)HomMat2dTranslateLocal(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)hom_mat2d_translate_local(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)
projective_trans_image(Image, TransImage, HomMat2DAdapted, 'bilinear', 'false', 'false')projective_trans_image(Image, TransImage, HomMat2DAdapted, "bilinear", "false", "false")ProjectiveTransImage(Image, TransImage, HomMat2DAdapted, "bilinear", "false", "false")ProjectiveTransImage(Image, TransImage, HomMat2DAdapted, "bilinear", "false", "false")projective_trans_image(Image, TransImage, HomMat2DAdapted, "bilinear", "false", "false")

For an explanation of the different 2D coordinate systems used in HALCON, see the introduction of chapter Transformations / 2D Transformations.

projective_trans_imageprojective_trans_imageProjectiveTransImageProjectiveTransImageprojective_trans_image can be executed on OpenCL devices if the input image does not exceed the maximum size of image objects of the selected device and the parameter TransformDomainTransformDomainTransformDomaintransformDomaintransform_domain is set to 'false'"false""false""false""false". The result can diverge slightly from that calculated on the CPU.

Execution Information

  • Supports OpenCL compute devices.
  • Multithreading type: reentrant (runs in parallel with non-exclusive operators).
  • Multithreading scope: global (may be called from any thread).
  • Automatically parallelized on tuple level.
  • Automatically parallelized on channel level.
  • Automatically parallelized on internal data level.

Parameters

ImageImageImageimageimage (input_object)  (multichannel-)image(-array) objectHImageHObjectHObjectHobject (byte* / uint2* / real*) *allowed for compute devices

Input image.

TransImageTransImageTransImagetransImagetrans_image (output_object)  (multichannel-)image(-array) objectHImageHObjectHObjectHobject * (byte / uint2 / real)

Output image.

HomMat2DHomMat2DHomMat2DhomMat2Dhom_mat_2d (input_control)  hom_mat2d HHomMat2D, HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Homogeneous projective transformation matrix.

InterpolationInterpolationInterpolationinterpolationinterpolation (input_control)  string HTuplestrHTupleHtuple (string) (string) (HString) (char*)

Interpolation method for the transformation.

Default: 'bilinear' "bilinear" "bilinear" "bilinear" "bilinear"

List of values: 'bilinear'"bilinear""bilinear""bilinear""bilinear", 'nearest_neighbor'"nearest_neighbor""nearest_neighbor""nearest_neighbor""nearest_neighbor"

AdaptImageSizeAdaptImageSizeAdaptImageSizeadaptImageSizeadapt_image_size (input_control)  string HTuplestrHTupleHtuple (string) (string) (HString) (char*)

Adapt the size of the output image automatically?

Default: 'false' "false" "false" "false" "false"

List of values: 'false'"false""false""false""false", 'true'"true""true""true""true"

TransformDomainTransformDomainTransformDomaintransformDomaintransform_domain (input_control)  string HTuplestrHTupleHtuple (string) (string) (HString) (char*)

Should the domain of the input image also be transformed?

Default: 'false' "false" "false" "false" "false"

List of values: 'false'"false""false""false""false", 'true'"true""true""true""true"

List of values (for compute devices): 'false'"false""false""false""false"

Possible Predecessors

vector_to_proj_hom_mat2dvector_to_proj_hom_mat2dVectorToProjHomMat2dVectorToProjHomMat2dvector_to_proj_hom_mat2d, hom_vector_to_proj_hom_mat2dhom_vector_to_proj_hom_mat2dHomVectorToProjHomMat2dHomVectorToProjHomMat2dhom_vector_to_proj_hom_mat2d, proj_match_points_ransacproj_match_points_ransacProjMatchPointsRansacProjMatchPointsRansacproj_match_points_ransac, proj_match_points_ransac_guidedproj_match_points_ransac_guidedProjMatchPointsRansacGuidedProjMatchPointsRansacGuidedproj_match_points_ransac_guided, hom_mat3d_projecthom_mat3d_projectHomMat3dProjectHomMat3dProjecthom_mat3d_project

See also

projective_trans_image_sizeprojective_trans_image_sizeProjectiveTransImageSizeProjectiveTransImageSizeprojective_trans_image_size, projective_trans_contour_xldprojective_trans_contour_xldProjectiveTransContourXldProjectiveTransContourXldprojective_trans_contour_xld, projective_trans_regionprojective_trans_regionProjectiveTransRegionProjectiveTransRegionprojective_trans_region, projective_trans_point_2dprojective_trans_point_2dProjectiveTransPoint2dProjectiveTransPoint2dprojective_trans_point_2d, projective_trans_pixelprojective_trans_pixelProjectiveTransPixelProjectiveTransPixelprojective_trans_pixel

Module

Foundation