图像预处理-翻转与仿射变换
最后更新时间:
文章总字数:
预计阅读时间:
一.图像翻转
cv2.flip(img,flipcode)
参数
- flipcode : 指定翻转类型的标志,为0,表示沿x轴翻转,>0(默认1) 表示沿y轴翻转,为 <0(默认-1) 表示水平+垂直翻转
OpenCV中,图片的镜像旋转以图像的中心为原点。
1 |
|
结果:
二.图像仿射变换
仿射变换(Affine Transformation)是一种线性变换,保持了点之间的相对距离不变。
2.1 仿射变换的基本性质
保持直线
保持平行
比例不变性
不保持角度和长度
2.2 仿射变换的基本原理
线性变换
二维空间中,图像点坐标为(x,y),仿射变换的目标是将这些点映射到新的位置(x’, y’)
下面用一个表达式来帮助理解:
中间的2*3矩阵就是变换矩阵,其中abcd都是处理旋转、平移、缩放的系数,tx,ty是平移的系数。
1 |
|
2.3 cv2.warpAffine(img,M,dsize)
M :2x3的变换矩阵,类型为 np.float32
dsize:输出图像的尺寸,形式为 (width,height)。
上述的旋转、平移等操作都需要这个函数实现,通过传入各种操作的变换矩阵,实现各种操作。
三.仿射变换操作
3.1 图像旋转
cv2.getRotationMatrix2D(center,angle,scale)
获取旋转矩阵,参数为:
center:旋转中心点的坐标,格式为(x,y)。
angle:旋转角度,单位为度,正值表示逆时针旋转负值表示顺时针旋转。
scale:缩放比例,若设为1,则不缩放。
返回值是 M ,2x3的旋转矩阵。
1 |
|
结果:
3.2 图像平移
使用 np.float32()
创建数组,把这个二维数组(变化矩阵)作为参数传给 cv2.warpAffine()
函数就可以实现平移。
代入表达式可得
1 |
|
1 |
|
结果:
3.3 图像缩放
同理创建数组,下面是这个变换矩阵的理解:
代入表达式可得:
1 |
|
1 |
|
结果:
3.4 图像剪切
剪切操作可以改变图形的形状,以便其在某个方向上倾斜,它将对象的形状改变为斜边平行四边形,而不改变其面积。也就是一个矩形的宽高都是不变的。它把图片的一个部分切下来放在了另一个地方。
那怎么实现呢?
- 沿x轴剪切:
1 |
|
- 沿y轴剪切:
1 |
|
因为根据warpAffine函数的公式,想要在把图像的一块空间切下来放在另一个地方,不能操作tx,ty,这样会使得整个图像的每个像素点发生平移,不会改变图像具体形状构造,这就是其与平移的区别。然后公式中,能让x,y增减值的只有用 shy 和 shx ,让点的另一个轴坐标乘以剪切因子来实现偏移。
x' = x+shy*y
相当于给x方向上加y方向上的变化,这样就可以有一个矢量变化,方向就会变为斜向上或斜向下,从而实现拉扯。也就是所谓的x偏移,y不变;x不变,y偏移。
1 |
|
结果: