基本操作2
Similarity Transform相似变换
Similarity Transform相似变换:图像形状大小不变,位置发生变化。比如:做平移、旋转。相似变换具有保角性、保比例性,经过相似变换以后原有的角度和比例保持不变。确定一个相似变换矩阵需要2对点(原图像2个点,对应变换后图像2个点)。OpenCV中相似变换的API如下。
import cv2
IMG = cv2.imread('lena.jpg', 1)
# 获取旋转矩阵,旋转中心、角度、缩放值
M = cv2.getRotationMatrix2D((IMG.shape[1] / 2, IMG.shape[0] / 2), 30, 0.7)
# 再通过旋转矩阵M求得变换后的图像
IMG_ROTATE = cv2.warpAffine(IMG, M, (IMG.shape[1], IMG.shape[0]))
cv2.imshow('lena', IMG)
cv2.imshow('lena_rotation', IMG_ROTATE)
key = cv2.waitKey()
if key == 27:
cv2.destroyAllWindows()
pass
Affine Transform仿射变换
Affine Transform仿射变换:图像形状变为平行四边形、旋转的平行四边形。还是在一个平面内的变换。确定一个仿射变换矩阵需要3对点(原图像3个不在同一直线上的点、对应变换后图像3个点)。OpenCV中仿射变换的API如下。
import cv2
import numpy as np
IMG = cv2.imread('lena.jpg', 1)
height = IMG.shape[0]
width = IMG.shape[1]
# 变换前图像上3个点pts1和对应的变换后图像上3个点pts2
pts1 = np.float32([[0, 0], [width - 1, 0], [0, height - 1]])
pts2 = np.float32([[width * 0.2, height * 0.1], [width * 0.9, height * 0.2], [width * 0.1, height * 0.9]])
# 获取放射变换矩阵
M = cv2.getAffineTransform(pts1, pts2)
IMG_AFFINE = cv2.warpAffine(IMG, M, (width, height))
cv2.imshow('image', IMG)
cv2.imshow('image_affine', IMG_AFFINE)
key = cv2.waitKey()
if key == 27:
cv2.destroyAllWindows()
pass
Perspective Transform透视变换
Perspective Transform透视变换:在3D条件下的变换,图像变为平行四边形或旋转的平行四边形,但图片与屏幕呈现角度。确定一个透视变换需要4对点。OpenCV中API调用如下。
import cv2
import numpy as np
IMG = cv2.imread('lena.jpg', 1)
height = IMG.shape[0]
width = IMG.shape[1]
pts1 = np.float32([[0, 0],
[0, width - 1],
[height - 1, 0],
[height - 1, width - 1]])
pts2 = np.float32([[height * 0.1, width * 0.15],
[height * 0.2, width * 0.73],
[height * 0.78, width * 0.11],
[height * 0.82, width * 0.86]])
M = cv2.getPerspectiveTransform(pts1, pts2)
IMG_PERSPECTIVE = cv2.warpPerspective(IMG, M, (height, width))
cv2.imshow('image', IMG)
cv2.imshow('image_perspective', IMG_PERSPECTIVE)
key = cv2.waitKey()
if key == 27:
cv2.destroyAllWindows()
pass