《OpenCV 轻松入门 面向Python》 学习笔记
仿射变换是指图像经过一系列的几何变换来实现平移,旋转等操作。
该变换能保证图像的平直性和平行性:
仿射变换是通过一个变换矩阵M实现的:
d s t _ i m g = M ⋅ s r c _ i m g = [ m 11 m 12 m 13 m 21 m 22 m 23 ] ⋅ [ x y 1 ] dst\_img = M \cdot src\_img = \begin{bmatrix} m_{11} & m_{12} & m_{13}\\ m_{21} & m_{22} & m_{23} \end{bmatrix} \cdot \begin{bmatrix} x\\ y\\ 1\\ \end{bmatrix} dst_img=M⋅src_img=[m11m21m12m22m13m23]⋅⎣⎡xy1⎦⎤
dst_img = cv2.warpAffine(src_img, M, dsize=(width, height))
参数:
src_img:原始图像
M:变换矩阵输出图像尺寸大小
dsize:输出图像尺寸大小,必填参数, 注意 dsize参数的指定顺序,(width, height),第一个是width, 第二个是height
进行那种形式的仿射变换完全取决于变换矩阵,下面两个例子介绍通过不同的变换矩阵实现平移和旋转
通过变换矩阵将图像向下推动100个像素,向右移动200 个像素
import cv2
import numpy as np
src_img = cv2.imread("/Users/manmi/Desktop/lena.bmp")
height, width = src_img.shape[:2]
M = np.float32([[1, 0, 100], [0, 1, 200]])
dst_img = cv2.warpAffine(src_img, M, (width, height))
cv2.imshow("src_img", src_img)
cv2.imshow("dst_img", dst_img)
cv2.waitKey()
cv2.destroyAllWindows()
输出:
在使用函数cv2.warpAffine()对图像进行旋转时,可以通过函数cv2.getRotationMatrix2D()获取转换矩阵。
cv2.getRotationMatrix2D() 函数原型:
cv2.getRotationMatrix2D(center, angle, scale)
举例, 要以图像中心为圆点,逆时针旋转45度, 并将目标图像缩小为原始图像的0.6倍:
import cv2
import numpy as np
src_img = cv2.imread("lena.bmp")
height, width = src_img.shape[:2]
M = cv2.getRotationMatrix2D((height/2, width/2), 45, 0.6)
dst_img = cv2.warpAffine(src_img, M, (width, height))
cv2.imshow("src_img", src_img)
cv2.imshow("dst_img", dst_img)
cv2.waitKey()
cv2.destroyAllWindows()
对于更复杂的仿射变换,opencv提供了函数cv2.getAffineTransform()来生成变换矩阵M。生成的矩阵目标是将原始图片转成一个平行四边行,方法是指定原始图像的三个顶点坐标,并且指定目标图像对应的三个点的坐标
cv2.getAffineTransform() 函数原型:
cv2.getAffineTransform(src, dst)
* 注意,角点左边也是先指定(第一个参数是)col,再指定(第二个参数是)row
举例:
import cv2
import numpy as np
src_img = cv2.imread("/Users/manmi/Desktop/lena.bmp")
rows, cols = src_img.shape[:2]
src_p = np.float32([[0, 0], [cols-1, 0], [0, rows-1]])
dst_p = np.float32([[0, rows*0.33], [cols*0.85, rows*0.25], [cols*0.15, rows*0.7]])
M = cv2.getAffineTransform(src_p, dst_p)
dst_img = cv2.warpAffine(src_img, M, (cols, rows))
cv2.imshow("src_img", src_img)
cv2.imshow("dst_img", dst_img)
cv2.waitKey()
cv2.destroyAllWindows()