【第10节】图像几何变换
目标
学习对图像进行各种几个变换,例如移动、旋转、仿射变换等。
将要学到的函数有:CV2.getPerspectiveTransform。
变换
OpenCV提供了两个变换函数, CV2.warpAffine和CV2.warpPerspective,使用这两个函数你可以实现所有类型的变换。CV2.warpAffine 接收的参数是2 x 3的变换矩阵,而CV2.warpPerspective接收的参数是3 x 3的变换矩.阵。
1、扩展缩放
扩展缩放只是改变图像的尺寸大小。OpenCV提供的函数CV2.resize()可以实现这个功能。图像的尺寸可以自己手动设置,你也可以指定缩放因子。我们可以选择使用不同的插值方法。在缩放时我们推荐使用CV2.INTER_ AREA,在扩展时我们推荐使用v2.INTER_ CUBIC (慢)和v2.INTER LINEAR。默认情况下所有改变图像尺寸大小的操作使用的插值方法都是CV2.INTER_ LINEAR。你可以使用下面任意一种方法改变图像的尺寸:
显示效果如下:

2、图像平移
平移就是将对象换一个位置。如果你要沿(x, y )方向移动,移动的距离是(tx,ty ),你可以以下面的方式构建移动矩阵:

你可以使用Numpy数组构建这个矩阵( 数据类型是np.f1loat32),然后把它传给函数CV2.warpAffine()。 看看下面这个例子吧,它被移动了( 100,50 )个像素。
显示效果:

3、图片旋转
对一个图片旋转角度θ,需要使用下面形式的旋转矩阵。

OpenCV允许你在任意地方进行旋转,但是旋转矩阵的形式应修改为:

其中:
为了构建这个旋转矩阵,OpenCV提供了一个函数;CV2.getRotationMatrix2D。下面的例子是在不缩放的情况下将图像旋转90度。
显示结果如下:

4、仿射变换
在仿射变换中,原图中所有的平行线在结果图像中同样平行。为了创建这个矩阵我们需要从原图像中找到三个点以及他们在输出图像中的位置。然后CV2.getAfneTransform会创建一个2x3的矩阵,最后这个矩阵会被传给函数CV2.warpAffine。
来看看下面的例子,以及我选择的点(被标记为红色的点)
显示效果:


5、透视变换
对于视角变换,我们需要一个3x3变换矩阵。在变换前后直线还是直线。要构建这个变换矩阵,你需要在输入图像上找4个点,以及他们在输出图像.上对应的位置。这四个点中的任意三个都不能共线。这个变换矩阵可以有函数CV2.getPerspectiveTransform()构建。然后把这个矩阵传给函数CV2.warpPerspective。
代码如下:
显示效果如下:

