几何变换是指改变图像的几何结构,例如大小、角度和形状等,从而使图像呈现出缩放、翻转、仿射和透视效果。
语法格式:dst = cv2.resize(src, dsize, fx, fy, interpolation)
参数说明:
src:原始图像;数组类型。
dsize:输出的图像的大小,格式为(宽W,高H),单位为像素;元组类型。
fx:可选参数;水平方向的缩放比例。
fy:可选参数;垂直方向的缩放比例。
interpolation:可选参数;缩放的插值方式。在图像缩小或放大时需要删减或填补像素,该参数可以指定使用哪种算法对像素进行增减;建议使用默认值。
dst:输出图像;数组类型。
注:
1.resize()方法有两种使用方式,一种是通过dsize参数缩放,另一种是通过fx和fy参数缩放;其中,dsize优先级比fx、fy高。
2.dsize参数是(宽W,高H)格式,而图像的shape属性是(高H,宽W)格式。
实例:

实例解释:
1.由dst1和dst2可知dsize优先级比fx、fy高;以及打印的高宽可知dsize参数格式与shape属性格式相反。
语法格式:dst = cv2.flip(src, flipCode)
参数说明:
src:原始图像;数组类型。
flipCode:翻转类型。0:X轴翻转;正数:Y轴翻转;负数:先X后Y或者说先Y后X。
dst:输出图像;数组类型。
实例:

图像的仿射变换是一种仅在二维平面中进行的几何变形,变换后的图像依然保持直线的“平直性”和“平行性”,即原来是直线的变换后依然是直线,原来是平行线的变换后依然是平行线。常见的仿射变换包括:平移、旋转和倾斜。
语法格式:dst = cv2.warpAffine(src, M, dsize, flags, borderMode, borderValue)
参数说明:
实例:

注:
1.仿射变换原理:假设某个像素点坐标为(x, y),设M = [[a, b, c], [d, e, f]],该像素点仿射变换后的新坐标为(X, Y)。现在来计算X、Y的值,X = x*a + y*b + c,Y = x*d + y*e + f。
2.平移、旋转和倾斜均利用仿射矩阵来变换,且仿射矩阵为32位浮点数类型。
平移仿射矩阵M:M = [[1, 0, 水平移动距离], [0, 1, 垂直移动距离]];距离为正数则向右和向下,这和之前讲的像素坐标系中的坐标正负一致。
实例:
看3-1的实例。
旋转仿射矩阵M:
由于想要得到旋转仿射矩阵M,需要经过复杂的运算;所以opencv提供了
getRotationMatrix2D()方法自动计算出旋转仿射矩阵M。
M = cv2.getRotationMatrix2D(center, angle, scale)实例:

opencv需要至少定位图像的3个点才能实现倾斜效果;3个点的位置类似为矩形的3个顶点,根据这三个点的位置变化计算出其他像素点的位置变化,从而实现图像的倾斜效果。依然满足直线的“平直性”和“平行性”,这也是为什么不需要矩形4个顶点坐标的原因。
倾斜仿射矩阵M:
同求旋转仿射矩阵M,opencv提供了
getAffineTransform()方法自动计算出倾斜仿射矩阵M。
M = cv2.getAffineTransform(src, dst)实例:

1.仿射实际上就是将图像在二维空间中变形;而透视就是将图像在三维空间中变形,即改变图像中物体的空间位置。比如:人眼在笔记本电脑某一边看另一边,靠近眼睛的一边会比远离眼睛的对边长,如下图所示。

2.opencv至少需要定位图像四个点才能计算透视矩阵M。因此,也就是说是不满足直线的“平直性”和“平行性”,这也是不把它归为仿射变换一类的原因。
语法格式:dst = cv2.warpPerspective(src, M, dsize, flags, borderMode, borderValue)
参数说明:
透视矩阵M:
opencv提供了
getPerspectiveTransform()方法自动计算出透视矩阵M。
M = getPerspectiveTransform(src, dst)实例:

1.非常坑的地方:前面操作像素章节时,像素坐标都是(H, W)的格式;但这里坐标全变成(W, H)格式了!dsize格式也是(W, H)!