![]() |
OpenCV 4.12.0
开源计算机视觉
|
缩放就是调整图像的大小。 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) 方向的位移,记为 \((t_x,t_y)\),则可以创建变换矩阵 \(\textbf{M}\),如下所示
\[M = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \end{bmatrix}\]
我们使用该函数:cv.warpAffine (src, dst, M, dsize, flags = cv.INTER_LINEAR, borderMode = cv.BORDER_CONSTANT, borderValue = new cv.Scalar())
| src | 输入图像。 |
| dst | 输出图像,其大小为 dsize,类型与 src 相同。 |
| Mat | 2 × 3 变换矩阵(cv.CV_64FC1 类型)。 |
| dsize | 输出图像的尺寸。 |
| flags | 插值方法的组合(请参阅 cv.InterpolationFlags)以及可选标志 WARP_INVERSE_MAP,表示 M 是逆变换(𝚍𝚜𝚝→𝚜𝚛𝚌) |
| borderMode | 像素外推方法(请参阅 cv.BorderTypes);当 borderMode = BORDER_TRANSPARENT 时,表示目标图像中对应于源图像中“异常值”的像素不会被该函数修改。 |
| borderValue | 在常数边界情况下使用的值;默认情况下,它是 0。 |
行。
图像旋转角度 \(\theta\) 是通过以下形式的变换矩阵实现的
\[M = \begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix}\]
但是 OpenCV 提供了具有可调旋转中心的缩放旋转,因此您可以在您喜欢的任何位置旋转。 修改后的变换矩阵由下式给出
\[\begin{bmatrix} \alpha & \beta & (1- \alpha ) \cdot center.x - \beta \cdot center.y \\ - \beta & \alpha & \beta \cdot center.x + (1- \alpha ) \cdot center.y \end{bmatrix}\]
其中
\[\begin{array}{l} \alpha = scale \cdot \cos \theta , \\ \beta = scale \cdot \sin \theta \end{array}\]
我们使用该函数: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 相同。 |
| Mat | 3 × 3 变换矩阵(cv.CV_64FC1 类型)。 |
| dsize | 输出图像的尺寸。 |
| flags | 插值方法的组合(cv.INTER_LINEAR 或 cv.INTER_NEAREST)以及可选标志 WARP_INVERSE_MAP,该标志将 M 设置为逆变换(𝚍𝚜𝚝→𝚜𝚛𝚌)。 |
| borderMode | 像素外推方法(cv.BORDER_CONSTANT 或 cv.BORDER_REPLICATE)。 |
| borderValue | 在常数边界情况下使用的值;默认情况下,它是 0。 |
cv.getPerspectiveTransform (src, dst)
| src | 源图像中四边形顶点的坐标。 |
| dst | 目标图像中相应四边形顶点的坐标。 |