opnecv实现旋转、平移和缩放图片的函数分别为:cv2.resize(), cv2.flip(), cv2.warpAffine()
教程
仿射变换=线性变换+平移。详见:如何通俗地讲解「仿射变换」这个概念?。这里主要涉及仿射变换的旋转、平移和缩放。
缩放图片
缩放就是调整图片的大小,使用cv2.resize()
函数实现缩放。可以按照比例缩放,也可以按照指定的大小缩放:
import cv2
img = cv2.imread('drawing.jpg')
# 按照指定的宽度、高度缩放图片
res = cv2.resize(img, (132, 150))
# 按照比例缩放,如x,y轴均放大一倍
res2 = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_LINEAR)
cv2.imshow('shrink', res), cv2.imshow('zoom', res2)
cv2.waitKey(0)
我们也可以指定缩放方法interpolation
,更专业点叫插值方法,默认是INTER_LINEAR
,全部可以参考:InterpolationFlags
翻转图片
镜像翻转图片,可以用cv2.flip()
函数:
dst = cv2.flip(img, 1)
其中,参数2 = 0:垂直翻转(沿x轴),参数2 > 0: 水平翻转(沿y轴),参数2 < 0: 水平垂直翻转。
平移图片
要平移图片,我们需要定义下面这样一个矩阵,tx,ty是向x和y方向平移的距离:
平移是用仿射变换函数cv2.warpAffine()
实现的:
# 平移图片
import numpy as np
rows, cols = img.shape[:2]
# 定义平移矩阵,需要是numpy的float32类型
# x轴平移100,y轴平移50
M = np.float32([[1, 0, 100], [0, 1, 50]])
# 用仿射变换实现平移
dst = cv2.warpAffine(img, M, (cols, rows))
cv2.imshow('shift', dst)
cv2.waitKey(0)
旋转图片
旋转同平移一样,也是用仿射变换实现的,因此也需要定义一个变换矩阵。OpenCV直接提供了 cv2.getRotationMatrix2D()
函数来生成这个矩阵,该函数有三个参数:
- 参数1:图片的旋转中心
- 参数2:旋转角度(正:逆时针,负:顺时针)
- 参数3:缩放比例,0.5表示缩小一半
# 45°旋转图片并缩小一半
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 0.5)
dst = cv2.warpAffine(img, M, (cols, rows))
cv2.imshow('rotation', dst)
cv2.waitKey(0)
小结
-
cv2.resize()
缩放图片,可以按指定大小缩放,也可以按比例缩放。 -
cv2.flip()
翻转图片,可以指定水平/垂直/水平垂直翻转三种方式。 - 平移/旋转是靠仿射变换
cv2.warpAffine()
实现的。