OpenCV提供了两种变换函数,cv2.warpAffine和cv2.warpPerspective,第一个是仿射变换函数,第二个是透视变换函数。第一个接收的参数是2x3的变换矩阵,第二个接收的是3x3变换矩阵。
扩展缩放
扩展缩放只是改变图像的尺寸大小。OpenCV提供的函数cv2.resize()可以实现这个功能,图像的尺寸可以自己手动设置,也可以自己指定缩放因子。
在缩放时,推荐使用cv2.INTER_AREA,在扩展时推荐使用cv2.INTER_CUBIC(慢)和cv2.INTER_LINEAR。默认情况下所用改变图像尺寸大小的操作使用的插值方法都是cv2.INTER_LINEAR.
resize = (“原图”,“输出图像大小”,“插值方法”)
cv2.resize(src, dst, interpolation=cv2.INTER_)
import cv2
img = cv2.imread("C:\\Users\\admin\\Desktop\\backgroud\\brids.jpg", 1)
# cv2.imshow("brids", img)
# cv2.waitKey(0)
# cv2.destroyAllWindows("brids")
resize_img = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC)
cv2.imshow('res_brids', resize_img)
cv2.waitKey(0)
cv2.destroyAllWindows("res_brids")
None是不指定输出图像大小,只有缩放因子决定。fx,fy 是缩放因子。大于1放大,小于1缩小。
平移
平移即是将对象换一个位置。如果沿着(x, y)方向移动,移动的距离是(tx, ty),可以用下面的方式构建移动矩阵:
M = [[1 0 tx]
[0 1 ty]]
可以使用Numpy数组构建这个矩阵(数据类型是np.float32),然后把它传给函数cv2.warpAfine().
旋转
import cv2
img = cv2.imread("C:\\Users\\admin\\Desktop\\backgroud\\brids.jpg", 1)
# cv2.imshow("brids", img)
# cv2.waitKey(0)
# cv2.destroyAllWindows("brids")
h, w, _ = img.shape
旋转中心 旋转角度 缩放因子
M = cv2.getRotationMatrix2D((h/2, w/2), 90, 1)
第三个参数是输出图像的尺寸中心
x_img = cv2.warpAffine(img, M, (2*h, 2*w))
cv2.imshow("x_birds", x_img)
cv2.waitKey(0)
cv2.destroyWindow()
仿射变换
仿射变换也可以说是“平面变换”或者“二维坐标变换”。
仿射变换是把一个二维坐标转换到另一个二维坐标的过程,转换过程坐标点的相对位置和属性不发生变换,是一个线性变换,该过程只发生旋转和平移。因此,一个平行四边形经过仿射变换后还是一个平行四边形。
仿射变换 = 旋转 + 平移
仿射变换的矩阵为:
其中,(x, y)是原图坐标,(x’, y’)是变换后的坐标,m11,m12,m21, m22为旋转量,m13,m23
为平移量。所以仿射变换矩阵实际为23的矩阵。
在OpenCV中实现仿射变换的函数为:
dst = warpAffine(src, M, (cols, rows)
src:输入图像
dst:输出图像
M:23的仿射变换矩阵
(cols, rows):输出图像的行数和列数,就是输出图像的大小
例:把一张图片顺时针旋转45°,向左平移200个像素点,向下平移30个像素点。
import cv2
import numpy as np
img = cv2.imread("C:\\Users\\admin\\Desktop\\backgroud\\brids.jpg", 1)
h, w, _ = img.shape
# 仿射变换矩阵
M = np.array([[np.cos(np.pi/4), -np.sin(np.pi/4), 200], [np.sin(np.pi/4), np.cos(np.pi/4), 30]])
dst = cv2.warpAffine(img, M, (2*h, 2*w))
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
透视变换
透视变换是把一个图像投影到一个新的视平面的过程,这个过程就是:把一个二维坐标系转换为三维坐标系,然后再把三维坐标系投影到新的二维坐标系。这个过程是一个非线性变换过程,一个平行四边形经过透视变换只能得到四边形,但是不平行。
透视变换的矩阵为:
其中,(x, y) 是原图坐标,(x’,y’)是变换后的坐标,m11,m12,m21,m22,m31,m32为旋转量,m13,m23,m33为平移量。因为透视变换是非线性的,所以不能齐次表示;透视变换矩阵为3x3.
在OpenCV中,实现透视变换的函数为:
dst = warpPerspective(src, H, (cols, rows))
src:输入图像
dst:输出图像
H:3X3透视变换矩阵
(cols, rows):输出图像的环境行数和列数