projective_trans_image(Image : TransImage : HomMat2D, Interpolation, AdaptImageSize, TransformDomain : )
projective_trans_image将齐次变换矩阵HomMat2D确定的投影变换(单应性)应用于输入图像Image ,并将结果存储到输出图像TransImage中。
如果参数AdaptImageSize 设置为“false”,TransImage的大小将与Image相同;
如果AdaptImageSize为“true”,则输出图像大小将自动调整,以便转换后的图像的所有非负点都是可见的。
参数Interpolation决定了用哪种插值方法来确定输出图像的灰度值。
对于Interpolation= 'nearest_neighbor',灰度值由输入图像中最近的像素决定。这种模式是非常快的,但也导致了典型的“锯齿”外观的大幅放大的图像。
对于Interpolation= '双线性',灰度值用双线性方法确定,会导致更长的运行时间,但也显着改善的结果。
参数TransformDomain 可以用来确定图像的域是否也被变换。
由于域的转换需要运行时间,因此应该使用此参数来指定是否需要这样做。
如果TransformDomain设置为“false”,则忽略输入图像的域,并转换完整图像。
例如,可以使用操作符vector_to_proj_hom_mat2d创建投影变换矩阵。
在单应性中,要投影的点由(x,y,w)的齐次向量表示。欧几里德点可以推导为(x',y') =(X/W,Y/W)。
就像在affine_trans_image中一样,x表示行坐标,而y表示projective_trans_image中的列坐标。
根据这种约定,仿射变换是射影变换的一种特殊情况,其中HomMat2D的最后一行的形式是(0,0,c)。
对于“byte”或“uint2”类型的图像,
系统参数“int_zooming”在定点算术的快速计算(“int_zooming”=“true”)和浮点算术的高精度计算(“int_zooming”=“false”)之间进行选择。
特别是Interpolation= '双线性'时,不动点计算会导致较小的灰度值偏差,因为较快的算法精度不超过1/16像素。
因此,当应用大尺寸'int_zooming' = 'false'时,建议使用'int_zooming' = 'false'。
参数:
Image,TransImage分别为输入输出图像
HomMat2D 齐次射影变换矩阵。
Interpolation 变换的插值方法,有 'bilinear', 'nearest_neighbor'。
AdaptImageSize 自动调整输出图像的大小标识,有 'false', 'true'
TransformDomain 输入图像的域也应该转换吗标识,有 'false', 'true'
1.projective_trans_image_size(Image : TransImage : HomMat2D, Interpolation, Width, Height, TransformDomain : )
projective_trans_image_size将齐次变换矩阵HomMat2D确定的射影变换(单应性)应用于输入图像Image ,并将结果存储到输出图像TransImage中。
TransImage将在输出维度Height*Width处剪切。
除此之外,projective_trans_image_size与上面介绍的函数projective_trans_image相同。
例程:
*程序演示如何使用hom_mat3d_project和projective_trans_image来旋转三维图像。
dev_update_pc ('off')
dev_update_window ('off')
dev_update_var ('off')
read_image (Image, 'mreut')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
* The transformed images will be displayed using a buffer window to create a smooth (i.e., flicker-free) display under both Windows and Unix.
*转换后的图像将使用一个缓冲区窗口显示,以便在Windows和Unix下显示不闪烁。
open_window (0, 0, Width, Height, 0, 'buffer', '', WindowHandleBuffer)
set_part (WindowHandleBuffer, 0, 0, Height - 1, Width - 1)
Iter := 1440
* 设置3D旋转角度的增量,注意,选择它们时,它们的公约数要尽可能小(0.1)。这将导致在重复之前具有最大长度的图像序列。
DAlpha := 1.1
DBeta := 1.3
DGamma := 1.7
* 3维旋转角度初始化
Alpha := 0.0
Beta := 0.0
Gamma := 0.0
*设置查看图像平面的虚拟相机的相机参数。
PrincipalRow := Height / 2
PrincipalColumn := Width / 2
Focus := (Width + Height) / 2
* 设置图像中心在三维运动的环面扭结的参数。这会产生环面结T(8,3)
M := 8
N := 3
*设置环面结的尺寸。
H := Height / 4.0
W := Width / 4.0
D := (Width + Height) / 6.0
for J := 1 to Iter by 1
*在3D中旋转平面
hom_mat3d_identity (HomMat3D)
hom_mat3d_rotate (HomMat3D, rad(Gamma), 'z', PrincipalRow, PrincipalColumn, Focus, HomMat3D)
hom_mat3d_rotate (HomMat3D, rad(Beta), 'y', PrincipalRow, PrincipalColumn, Focus, HomMat3D)
hom_mat3d_rotate (HomMat3D, rad(Alpha), 'x', PrincipalRow, PrincipalColumn, Focus, HomMat3D)
* 将图像的中心平移到环面上的一点。
T := rad(J / 4.0)
X := H * (cos(N * T) + 0.5 * cos(M * T) * cos(N * T))
Y := W * (sin(N * T) + 0.5 * cos(M * T) * sin(N * T))
Z := D * sin(M * T)
hom_mat3d_translate (HomMat3D, X, Y, Z, HomMat3D)
*投影图像的平面,即,从输入图像的平面到输出图像的平面。创建一个2D射影变换
hom_mat3d_project (HomMat3D, PrincipalRow, PrincipalColumn, Focus, ProjectionMatrix)
*一些变换可能导致一个奇异变换矩阵。因此,我们需要在这里执行错误处理。
dev_set_check ('~give_error')
dev_error_var (Error, 1)
*projective_trans_image (Image, TransImage, ProjectionMatrix, 'bilinear', 'false', 'false')
projective_trans_image_size (Image, TransImage, ProjectionMatrix, 'bilinear', Width/2, Height/2, 'false')
dev_error_var (Error, 0)
dev_set_check ('give_error')
if (Error == H_MSG_TRUE)
* 在缓冲区窗口中显示图像并将其复制到可见窗口
clear_window (WindowHandleBuffer)
disp_obj (TransImage, WindowHandleBuffer)
copy_rectangle (WindowHandleBuffer, WindowHandle, 0, 0, Height - 1, Width - 1, 0, 0)
endif
*增加旋转角度。
Alpha := fmod(Alpha + DAlpha,360)
Beta := fmod(Beta + DBeta,360)
Gamma := fmod(Gamma + DGamma,360)
wait_seconds (0.02)
endfor
close_window (WindowHandleBuffer)
例程实现将二维图像在3维空间的旋转与显示
结果如图
工业视觉halcon projective_trans_image函数介绍
|