OpenCV  
开源计算机视觉
正在加载...
正在搜索...
无匹配项
图像的几何变换

目标

变换

缩放

缩放只是调整图像大小。OpenCV 提供了一个名为 cv.resize() 的函数来实现此目的。可以手动指定图像的大小,也可以指定缩放比例。使用不同的插值方法。首选插值方法是用于缩小的 cv.INTER_AREA 和用于缩放的 cv.INTER_CUBIC(慢)和 cv.INTER_LINEAR

我们使用函数:cv.resize (src, dst, dsize, fx = 0, fy = 0, interpolation = cv.INTER_LINEAR)

参数
src输入图像
dst输出图像;它的大小为 dsize(当它不为零时)或从 src.size()、fx 和 fy 计算的大小;dst 的类型与 src 相同。
dsize输出图像大小;如果它等于零,则计算如下

𝚍𝚜𝚒𝚣𝚎=𝚂𝚒𝚣𝚎(𝚛𝚘𝚞𝚗𝚍(𝚏𝚡𝚜𝚛𝚌.𝚌𝚘𝚕𝚜),𝚛𝚘𝚞𝚗𝚍(𝚏𝚢𝚜𝚛𝚌.𝚛𝚘𝚠𝚜))

dsize 或 fx 和 fy 必须不为零。
fx水平轴上的缩放比例;当它等于 0 时,计算如下

(𝚍𝚘𝚞𝚋𝚕𝚎)𝚍𝚜𝚒𝚣𝚎.𝚠𝚒𝚍𝚝𝚑/𝚜𝚛𝚌.𝚌𝚘𝚕𝚜

fy垂直轴上的缩放比例;当它等于 0 时,计算如下

(𝚍𝚘𝚞𝚋𝚕𝚎)𝚍𝚜𝚒𝚣𝚎.𝚑𝚎𝚒𝚐𝚑𝚝/𝚜𝚛𝚌.𝚛𝚘𝚠𝚜

interpolation插值方法(请参阅 cv.InterpolationFlags

试一试

平移

平移是对象位置的移动。如果您知道(x,y)方向的移动量,设为 (tx,ty),您可以创建如下所示的变换矩阵 M

M=[10tx01ty]

我们使用函数:cv.warpAffine (src, dst, M, dsize, flags = cv.INTER_LINEAR, borderMode = cv.BORDER_CONSTANT, borderValue = new cv.Scalar())

参数
src输入图像。
dst输出图像,大小为 dsize,类型与 src 相同。
Mat2 × 3 变换矩阵(cv.CV_64FC1 类型)。
dsize输出图像的大小。
flags插值方法的组合(请参阅 cv.InterpolationFlags)以及可选标志 WARP_INVERSE_MAP,表示 M 是逆变换( 𝚍𝚜𝚝→𝚜𝚛𝚌 )
borderMode像素外推方法(请参阅 cv.BorderTypes);当 borderMode = BORDER_TRANSPARENT 时,表示目标图像中对应于源图像中“异常值”的像素不会被函数修改。
borderValue在常量边界情况下使用的值;默认情况下,它为 0。

行。

试一试

旋转

图像以角度 θ 旋转是通过以下形式的变换矩阵实现的

M=[cosθsinθsinθcosθ]

但 OpenCV 提供可调整旋转中心的缩放旋转,以便您可以在任何您喜欢的位置旋转。修改后的变换矩阵由以下公式给出

[αβ(1α)center.xβcenter.yβαβcenter.x+(1α)center.y]

其中

α=scalecosθ,β=scalesinθ

我们使用函数:cv.getRotationMatrix2D (center, angle, scale)

参数
center源图像中旋转的中心。
angle旋转角度(以度为单位)。正值表示逆时针旋转(假设坐标原点位于左上角)。
scale各向同性缩放比例。

试一试

仿射变换

在仿射变换中,原始图像中的所有平行线在输出图像中仍然是平行的。要找到变换矩阵,我们需要输入图像中的三个点以及它们在输出图像中的对应位置。然后 cv.getAffineTransform 将创建一个 2x3 矩阵,该矩阵将传递给 cv.warpAffine

我们使用函数:cv.getAffineTransform (src, dst)

参数
src来自输入图像的三个点([3, 1] 大小和 cv.CV_32FC2 类型)。
dst输出图像中的三个对应点([3, 1] 大小和 cv.CV_32FC2 类型)。

试一试

透视变换

对于透视变换,您需要一个 3x3 变换矩阵。即使在变换之后,直线也会保持直线。要找到此变换矩阵,您需要输入图像上的 4 个点以及输出图像上的对应点。在这 4 个点中,其中 3 个不应共线。然后可以通过函数 cv.getPerspectiveTransform 找到变换矩阵。然后将 cv.warpPerspective 应用于此 3x3 变换矩阵。

我们使用函数:cv.warpPerspective (src, dst, M, dsize, flags = cv.INTER_LINEAR, borderMode = cv.BORDER_CONSTANT, borderValue = new cv.Scalar())

参数
src输入图像。
dst输出图像,大小为 dsize,类型与 src 相同。
Mat3 × 3 变换矩阵(cv.CV_64FC1 类型)。
dsize输出图像的大小。
flags插值方法的组合(cv.INTER_LINEARcv.INTER_NEAREST)以及可选标志 WARP_INVERSE_MAP,它将 M 设置为逆变换( 𝚍𝚜𝚝→𝚜𝚛𝚌 )。
borderMode像素外推方法(cv.BORDER_CONSTANTcv.BORDER_REPLICATE)。
borderValue在常量边界情况下使用的值;默认情况下,它为 0。

cv.getPerspectiveTransform (src, dst)

参数
src源图像中四边形顶点的坐标。
dst目标图像中对应四边形顶点的坐标。

试一试