OpenCV 4.11.0
开源计算机视觉库
|
OpenCV 提供了两个变换函数,cv.warpAffine 和 cv.warpPerspective,你可以用它们执行各种变换。cv.warpAffine 使用一个 2x3 变换矩阵,而 cv.warpPerspective 使用一个 3x3 变换矩阵作为输入。
缩放只是调整图像大小。OpenCV 提供了函数 cv.resize() 用于此目的。可以手动指定图像大小,或者可以指定缩放比例。使用了不同的插值方法。首选的插值方法是缩小图像使用cv.INTER_AREA,放大图像使用cv.INTER_CUBIC(慢)和cv.INTER_LINEAR。默认情况下,所有调整大小操作都使用插值方法cv.INTER_LINEAR。你可以使用以下任一方法调整输入图像的大小
平移是对象位置的移动。如果你知道 (x,y) 方向的位移,并将其设为 \((t_x,t_y)\),你可以创建如下所示的变换矩阵 \(\textbf{M}\)
\[M = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \end{bmatrix}\]
你可以将其转换为 np.float32 类型的 NumPy 数组,并将其传递到 cv.warpAffine() 函数中。请参阅下面的示例,该示例将 (100,50) 进行位移。
警告
cv.warpAffine() 函数的第三个参数是输出图像的大小,应为 (宽度, 高度) 的形式。记住宽度 = 列数,高度 = 行数。
请参见下面的结果
图像以角度 \(\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}\]
为了找到这个变换矩阵,OpenCV 提供了一个函数,cv.getRotationMatrix2D。查看下面的示例,该示例在不进行任何缩放的情况下,相对于中心将图像旋转 90 度。
查看结果
在仿射变换中,原始图像中的所有平行线在输出图像中仍然是平行的。为了找到变换矩阵,我们需要输入图像中的三个点及其在输出图像中的对应位置。然后 cv.getAffineTransform 将创建一个 2x3 矩阵,该矩阵将传递到 cv.warpAffine。
查看下面的示例,并查看我选择的点(以绿色标记)
查看结果
透视变换需要一个 3x3 的变换矩阵。直线在变换后仍然保持直线。要找到这个变换矩阵,需要输入图像上的 4 个点及其在输出图像上对应的 4 个点。这 4 个点中,任意 3 个点不能共线。然后可以通过函数 **cv.getPerspectiveTransform** 找到变换矩阵。然后使用这个 3x3 变换矩阵应用 **cv.warpPerspective**。
参见下面的代码
结果