5.3 几何变换--仿射 cv2.warpAffine()

《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=Msrc_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)
  • src: 代表输入图像的三个点坐标, 形为:$[[col_1, row_1], [col_2, row_2], [col_3, row_3]]
  • dst: 代表输出图像的三个点坐标, 形为:$[[col_1, row_1], [col_2, row_2], [col_3, row_3]]

* 注意,角点左边也是先指定(第一个参数是)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()

你可能感兴趣的:(OpenCV,计算机视觉,opencv,python)